UINavigationController 的自定义动画推送未正确呈现导航栏
Posted
技术标签:
【中文标题】UINavigationController 的自定义动画推送未正确呈现导航栏【英文标题】:Custom animation for UINavigationController push not rendering navbar correctly 【发布时间】:2012-06-23 00:42:18 【问题描述】:在自定义转场中,我有以下简单的过渡:
- (void) perform
UIViewController *src = (UIViewController *) self.sourceViewController;
UIViewController *dst = (UIViewController *) self.destinationViewController;
[UIView transitionWithView:src.navigationController.view duration:1
options:UIViewAnimationOptionTransitionFlipFromBottom
animations:^
[src.navigationController pushViewController:dst animated:NO];
completion:NULL];
内容视图的动画效果很好。但是,在执行动画时,顶部的导航栏布局混乱(按钮都挤在左上角,没有标题),只有在动画完成时才会弹出到位。任何人都知道我做错了什么以及如何解决它?谢谢!
【问题讨论】:
【参考方案1】:找出我的问题。考虑到 UINavigationController 如何工作并与它管理的 UIViewController 交互,原始代码确实不正确。 (像我在 OP 中所做的那样令人讨厌的事情可以在旧的 SO 帖子中找到作为解决方案。)
这是对我有用的代码(有一点小问题):
- (void) perform
UIViewController *src = (UIViewController *) self.sourceViewController;
UIViewController *dst = (UIViewController *) self.destinationViewController;
[UIView transitionFromView:src.view
toView:dst.view
duration:1
options:UIViewAnimationOptionTransitionFlipFromBottom
completion:nil];
[UIView transitionFromView:src.navigationItem.titleView
toView:dst.navigationItem.titleView
duration:1
options:UIViewAnimationOptionTransitionFlipFromBottom
completion:nil];
[src.navigationController pushViewController:dst animated:NO];
Quibble:这将使导航栏与内容视图分开设置动画,因此您可以翻转两块而不是整个屏幕。我最初试图这样做:
[UIView transitionFromView:src.navigationController.view
toView:dst.navigationController.view
但这失败了,因为 1) 目的地的 navigationController 属性在它被推送到导航控制器之前还没有设置,2) 即使我指的是同一个视图!我忘记了
导航控制器的视图只是几个容器 其他视图,包括导航栏、可选工具栏和 包含您的自定义内容的视图...虽然 导航栏和工具栏视图发生变化,视图本身会发生变化 不是...导航控制器对象构建 导航栏动态使用导航项(实例 UINavigationItem 类)与视图控制器相关联 导航堆栈。要更改导航栏的内容, 因此,您必须为自定义视图配置导航项 控制器。 (docs)
【讨论】:
非常感谢!你的代码被剪断帮助我弄清楚,我如何在推送期间只动画导航栏切换,而不是内容视图切换【参考方案2】:另一个“狡辩”? 我放了
[src.navigationController pushViewController:dst animated:YES];
之前
[UIView transitionFromView ...
以便在目的地的 viewDidLoad 方法中可以访问导航控制器。
【讨论】:
以上是关于UINavigationController 的自定义动画推送未正确呈现导航栏的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式在 UINavigationController 中设置 UINavigationBar 的自定义子类
访问 UIViewController 中的自定义 UINavigationController 属性和方法
使用 UINavigationController 默认 UIToolbar 的自定义背景
带有按钮的自定义 UINavigationController