Как сделать анимацию пролистывания между двумя UIViewControllers при нажатии кнопки информации? - PullRequest
36 голосов
/ 07 января 2011

У меня есть страница входа с именем «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, могу ли я показать другой класс контроллера представления, нажимая кнопку информации?Помните, что сальто отлично работает с UIView.Но когда я пытаюсь использовать UIViewController, это создает проблемы.

Может кто-нибудь посоветовать мне, как показать UIViewController (в моем приложении мне нужно показать AboutViewController) при нажатии кнопки информации с флипомэффект?

Ответы [ 5 ]

126 голосов
/ 12 сентября 2011

Чтобы перевернуть контроллер вида:

viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:viewController animated:YES completion:nil];

Чтобы вытащить из него:

[self dismissViewControllerAnimated:YES completion:nil];
21 голосов
/ 13 июля 2011

Вот как я это делаю:

 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];

Кредит идёт на фейсар здесь .

5 голосов
/ 07 января 2011

Существует фундаментальный недостаток в вашем понимании структуры MVC в Cocoa Touch, а именно: контроллеры представлений и представления сопоставимы и похожи.Правда в том, что это не так.

Возвращаясь к вашему конкретному вопросу, да, анимации основаны на представлениях, а не на контроллерах представлений.Но каждое представление должно контролироваться одним из ваших контроллеров представления.И это то, что вид, принадлежащий контролеру, полностью зависит от вас.В вашем случае анимация может происходить между двумя представлениями с двумя разными контроллерами или между двумя представлениями одного и того же контроллера.

Что касается примеров кода, я предлагаю вам взглянуть на один из Xcodeшаблоны по умолчанию, служебное приложение , которое реализовало эту анимацию щелчка и щелчка кратким и стандартизированным способом.

1 голос
/ 25 ноября 2017
  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)

    }
0 голосов
/ 07 февраля 2017

простых строк кода

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];
...