一种很好的方法是使用iOS5+的UIViewController的子视图控制器功能(称为视图控制器容器)来实现。直到我观看了详细解释这一功能的WWDC视频之前,我确实很难理解如何操作。
简而言之,它允许您创建自己的父视图控制器,拥有一系列子视图控制器。这个单一的父视图控制器可以(并且可能应该,除非你正在做一些非常花哨的东西:P)作为您的应用程序窗口的根视图控制器。这种让单个视图控制器作为父级的方法(并促进添加、删除和转换子视图控制器)类似于UINavigationController所做的(这是苹果的意图)。现在,您可以创建自己的类似UINavigationController的父视图控制器,但具有完全不同的过渡动画和用户界面。
例如,在父视图控制器中,我在viewDidLoad中像这样添加第一个子控制器:
self.currentlyDisplayedChildViewController = [[TheFirstViewController alloc] init]
[self addChildViewController:self.currentlyDisplayedChildViewController]
[self.view addSubview:self.currentlyDisplayedChildViewController.view]
[self.currentlyDisplayedChildViewController didMoveToParentViewController:self]
然后我会有一个函数来执行转换到下一个子视图控制器(注意:此函数属于父视图控制器 - 作为您的UINavigationController的视图控制器):
- (void)transitionToViewController:(UIViewController *)nextChildViewController
{
[self addChildViewController:nextChildViewController];
__weak TheParentViewController *me = self;
[self transitionFromViewController:self.currentlyDisplayedChildViewController
toViewController:nextChildViewController
duration:1.0f
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:nil
completion:^(BOOL finished)
{
[nextChildViewController didMoveToParentViewController:self];
[me.currentlyDisplayedChildViewController willMoveToParentViewController:nil];
[me.currentlyDisplayedChildViewController removeFromParentViewController];
me.currentlyDisplayedChildViewController = nextChildViewController;
}];
}
非常好的一点是,您可以使用所有标准的UIViewAnimationTransition选项(或在动画块中定义自己的自定义动画)。另外,任何方向旋转事件都会自动从父视图控制器转发到子视图控制器。这是在自己进行自定义根视图控制器操作时遇到的最棘手的问题之一。
我建议看一下名为“实现UIViewController容器”的WWDC2011视频。
UINavigationController
。我只是想了解如何在没有它的情况下完成这个任务。 - GarlicFries