为作为 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
的父控制器
我们手动将 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];
他们是必不可少的。
我正在尝试使用 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
我们手动将 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];
他们是必不可少的。