Как сделать флип-анимацию между двумя UIViewControllers при нажатии кнопки информации?
У меня есть страница входа в систему с именем "LoginViewController". У меня есть информационная кнопка на этой странице. Если я нажму на него, я хочу показать некоторую информацию о моем приложении. Также я хочу представить эту страницу информации с использованием флип-анимации.
Код для создания информационной кнопки:
infoButton = [UIButton buttonWithType:UIButtonTypeInfoLight];
infoButton.frame = CGRectMake(285, 425, 30, 30);
infoButton.backgroundColor = [UIColor clearColor];
[infoButton addTarget:self
action:@selector(displayInfoView)
forControlEvents:UIControlEventTouchUpInside];
Если я нажму кнопку "Информация", вызывается метод displayInfoView
. Там я могу показать UIView
, чтобы отобразить некоторую информацию. Я прав?
Для флип-анимации я использовал этот код...
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:.8];
[UIView setAnimationTransition:([loginPageView superview] ? UIViewAnimationTransitionFlipFromLeft : UIViewAnimationTransitionFlipFromRight)
forView:mainView
cache:YES];
if ([infoView superview]) {
[infoView removeFromSuperview];
[mainView addSubview:loginPageView];
}
else {
[loginPageView removeFromSuperview];
[mainView addSubview:infoView];
}
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
[UIView commitAnimations];
Здесь loginPageView
- это окно входа, содержащее кнопку информации. infoView
- это представление, содержащее информацию о приложении. mainView
- это общее представление, которое содержит текущий вид.
Теперь моя проблема, вместо того, чтобы показывать UIView
, могу ли я показать другой класс контроллера представления при нажатии кнопки информации? Помните, что действие flip отлично работает с UIView
. Но когда я пытаюсь использовать UIViewController
, это создает проблемы.
Может кто-нибудь предложить мне, как показать UIViewController (в моем приложении, мне нужно показать AboutViewController
), когда вы нажимаете кнопку информации с эффектом flip?
Ответы
Ответ 1
Чтобы перейти в контроллер вида:
viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:viewController animated:YES completion:nil];
Чтобы вывести из него:
[self dismissViewControllerAnimated:YES completion:nil];
Ответ 2
Вот как я это делаю:
AboutShowViewController *aboutShowViewController = [[AboutShowViewController alloc] initWithNibName:@"AboutShowViewController" bundle:[NSBundle mainBundle]];
[UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:0.80];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight
forView:self.navigationController.view cache:NO];
[self.navigationController pushViewController:aboutShowViewController animated:YES];
[UIView commitAnimations];
[aboutShowViewController release];
Кредит отправляется на faysar здесь.
Ответ 3
Существует фундаментальный недостаток в понимании структуры MVC в Cocoa Touch, который является Контроллеры просмотра и Виды сопоставимы и похожи. Правда в том, что они не являются.
Вернемся к вашему конкретному вопросу, да, анимация основана на представлениях, а не на контроллерах представлений. Но каждый вид должен контролироваться одним из ваших контроллеров. И эта вещь, которая-view-принадлежит-к-тому-контроллеру, полностью зависит от вас. В вашем случае анимация может произойти между двумя представлениями с двумя разными контроллерами, или они также могут произойти между двумя представлениями одного и того же контроллера.
Что касается примеров кода, я предлагаю вам взглянуть на один из шаблонов по умолчанию Xcode, Утилита, которая реализовала эту анимацию щелчка и щелчка сжатым и стандартизованным способом.
Ответ 4
простые строки кода
YourViewController *city = [self.storyboard instantiateViewControllerWithIdentifier:@"YourViewController"];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:.5];
[self.navigationController pushViewController:city animated:YES];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.navigationController.view cache:NO];
[UIView commitAnimations];
Ответ 5
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(true)
// for back button
changeTransition()
}
//btnMap.addTarget(self, action: #selector(searchHotelsResultVC.goToMap), for: .touchUpInside)
//btnMap.addTarget(self, action: #selector(MapViewController.backToList), for: .touchUpInside)
func goToMap() {
// for pushing
changeTransition()
navigationController?.pushViewController(settingsVC, animated: false)
}
func backToList() {
// for dismiss
changeTransition()
navigationController?.popViewController(animated: false)
dismiss(animated: true, completion: nil)
}
func changeTransition() {
let transition = CATransition()
transition.duration = 0.5
transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
//transition.type = kCATransitionPush
transition.type = "flip"
transition.subtype = kCATransitionFromLeft
navigationController?.view.layer.add(transition, forKey: kCATransition)
}