我正在尝试使用transitioningDelegate在从VC1转换到VC2时应用自定义动画。这通常有效,但现在需要VC2中的导航栏。因此,我将VC2嵌入到导航控制器中,它将我的导航栏变为现在,但现在不会调用执行动画的方法(通过transitioningDelegate)。我无法将动画用于导航控制器,因为VC2本质上是导航控制器的根,所以后续的推/弹可以是动画但不是第一个。
动画导航控制器时是否需要特殊功能?
这是在Xcode 7,iOS 9和使用Storyboard。
请帮忙。
PS:圣诞快乐!答案 0 :(得分:0)
首先,对于您的问题,似乎在您的动画代码中,您应该使用导航控制器对象而不是VC2
作为动画的一部分,而不是VC2
,因为您嵌入它,否则,你不会在导航堆栈中拥有VC2
。
根据我的经验,transitioningDelegate是关于呈现具有自定义模式演示类型的视图控制器。如果你想要高级视图控制器转换,它有局限性,因为不是每个场景都适合于呈现(模态)'一个控制器,比如我有一个登录视图控制器,并在登录控制器上显示你的家庭视图控制器是有限的。
我曾经创建了一个容器控制器,它是所有其他控制器的父控件,所以我可以使用
- (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
我们手动将VC1
和navigationController
(嵌入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];
他们是必不可少的。