为作为 UINavigationController 的视图控制器设置动画

Animating to View Controller that is a UINavigationController

我正在尝试使用 transitioningDelegate 在从 VC1 转换到 VC2 时应用自定义动画。这在一般情况下是可行的,但现在 VC2 中需要一个导航栏。因此,我将 VC2 嵌入到导航控制器中,它让我获得了导航栏,但现在不调用执行动画的方法(通过 transitioningDelegate)。我不能将动画用于导航控制器,因为 VC2 本质上是我的导航控制器的根,因此,后续 push/pop 可以动画但不是第一个。

导航控制器的动画有什么特别需要的吗?

这是在 Xcode 7、iOS 9 中使用 Storyboard。

请帮忙。

PS:圣诞快乐!

所以首先,对于你的问题,在你的动画代码中,你应该使用导航控制器对象而不是 VC2 作为动画的一部分,而不是 VC2,因为您嵌入了它,否则,您的 VC2 将不会出现在导航堆栈中。

根据我的经验,transitioningDelegate 是关于呈现具有自定义模式呈现类型的视图控制器。如果您想要高级视图控制器转换,它有局限性,因为并非每个场景都适合 'presenting(modal)' 控制器,例如我有一个登录视图控制器,并且在登录控制器上显示您的主视图控制器有点受限。

我曾经创建一个容器控制器,它是所有其他控制器的父级,所以我可以使用

- (void)transitionFromViewController:(UIViewController *)fromViewController 
                    toViewController:(UIViewController *)toViewController 
                            duration:(NSTimeInterval)duration 
                             options:(UIViewAnimationOptions)options 
                          animations:(void (^)(void))animations 
                          completion:(void (^)(BOOL finished))completion

最终控制子视图控制器之间的传输和动画。它与模式、导航控制器无关,它们只需要在一个公共的父视图控制器中,比如 appDelegate.window.rootViewController

假设我们有一个名为 parentViewController

的父控制器

我们手动将 VC1navigationController(嵌入 VC2)添加到 parentViewController 中,并使用您喜欢的动画传输它们:

[parentViewController addChildViewController:VC1]; 
[parentViewController addChildViewController:navigationController]; 
[VC1 willMoveToParentViewController:nil];

[parentViewController transitionFromViewController:VC1
                                  toViewController:navigationController
                                          duration:duration
                                           options:options
                                        animations:^{
                                          // your animation code, or do nothing and use UIViewAnimationOptionTransitionCrossDissolve as options to have a default animation
                                      } completion:^(BOOL finished) {
                                          [navigationController didMoveToParentViewController:parentViewController];
                                          [VC1 removeFromParentViewController];
                                      }];

注意

[VC1 willMoveToParentViewController:nil];
[navigationController didMoveToParentViewController:parentViewController];
[VC1 removeFromParentViewController];

他们是必不可少的。