编辑:新的答案适用于任何方向。
原始答案仅在界面为纵向时有效。这是因为用不同的视图替换视图的视图转换动画必须发生在至少低于添加到窗口的第一个视图的级别的视图上(例如window.rootViewController.view.anotherView
)。
我实现了一个简单的容器类,我称之为TransitionController
。您可以在https://gist.github.com/1394947找到它。
另外,我更喜欢在一个单独的类中实现,因为它更容易重用。如果您不想这样做,您可以直接在应用程序委托中实现相同的逻辑,从而消除了TransitionController
类的需要。但是,您需要的逻辑将是相同的。
使用方法如下:
在您的应用程序委托中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
MyViewController *vc = [[MyViewContoller alloc] init...];
self.transitionController = [[TransitionController alloc] initWithViewController:vc];
self.window.rootViewController = self.transitionController;
[self.window makeKeyAndVisible];
return YES;
}
从任何视图控制器转换到新的视图控制器:
- (IBAction)flipToView
{
anotherViewController *vc = [[AnotherViewController alloc] init...];
MyAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
[appDelegate.transitionController transitionToViewController:vc withOptions:UIViewAnimationOptionTransitionFlipFromRight];
}
编辑:原始答案如下 - 仅适用于纵向方向
我为这个例子做出了以下假设:
您已经将一个视图控制器分配为窗口的rootViewController
当您切换到新视图时,您希望使用拥有新视图的视图控制器替换当前的视图控制器。任何时候,只有当前的视图控制器是活动的(例如alloc'ed)。
代码可以很容易地修改以实现不同的工作方式,关键点是动画转换和单个视图控制器。确保您不会在分配给window.rootViewController
之外的任何地方保留视图控制器。
代码以动画形式在应用程序委托中进行过渡
- (void)transitionToViewController:(UIViewController *)viewController
withTransition:(UIViewAnimationOptions)transition
{
[UIView transitionFromView:self.window.rootViewController.view
toView:viewController.view
duration:0.65f
options:transition
completion:^(BOOL finished){
self.window.rootViewController = viewController;
}];
}
在视图控制器中的使用示例
- (IBAction)flipToNextView
{
AnotherViewController *anotherVC = [[AnotherVC alloc] init...];
MyAppDelegate *appDelegate = (MyAppDelegate *)[UIApplication sharedApplication].delegate;
[appDelegate transitionToViewController:anotherVC
withTransition:UIViewAnimationOptionTransitionFlipFromRight];
}