Подтвердить что ты не робот

Как сделать флип-анимацию между двумя 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?

4b9b3361

Ответ 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)

    }