点击信息按钮时如何在两个UIViewControllers之间执行翻转动画?

37
我有一个名为"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)而不是 UIView 吗?

5个回答

128

将视图翻转到视图控制器:

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

翻转出它:

[self dismissViewControllerAnimated:YES completion:nil];

1
我以为我需要一个导航控制器,直到我看了你的答案。 - Elliot Yap

21

这是我正在做的方法:

 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在这里提供了帮助。


1
导航控制器有一个非常明确的目的,模态视图控制器也是如此。为什么要使用一个来实现另一个的目的呢? - Filip Radelic
2
因为Michael的版本可以在不翻转UITabBar的情况下工作。谁问过模态视图控制器了? - Jonas Sourlier

5
您对Cocoa Touch中MVC结构的理解存在一个根本性缺陷,即视图控制器视图是可比较和相似的。事实上,它们并不相同。
回到您具体的问题,是的,动画是基于视图而不是视图控制器的。但每个视图都应该由一个视图控制器控制。哪个视图属于哪个控制器完全取决于您。在您的情况下,动画可以发生在具有2个不同控制器的2个视图之间,也可以发生在同一控制器的2个视图之间。
至于代码示例,我建议您查看Xcode的默认模板之一,即Utility Application,它以简洁和标准化的方式实现了这种点击和翻转动画。

谢谢您的回复...我正在尝试在两个视图控制器之间进行动画,而不是视图。 - Rajkanth
它在一个视图控制器和一个视图中运行良好。但是在两个视图控制器中无法正常工作。 - Rajkanth
1
你能否编辑一下你的代码格式,这样我就可以看一下了吗?现在这个格式太乱了,我甚至不知道从哪里开始。 - Di Wu

1
  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

简单的代码行

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接