在自定义segue中,我有以下简单过渡:
- (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];
}
内容视图动画效果很好。但是,在执行动画时,顶部的导航栏有一个混乱的布局(按钮全部塞满左上角,没有标题),只有在动画结束时弹出到位。任何人都知道我做错了什么以及如何解决它?谢谢!
答案 0 :(得分:6)
弄清楚我的问题。考虑到UINavigationController如何工作以及与它管理的UIViewControllers交互,原始代码确实是错误的。 (像我在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];
}
狡辩:这会将导航栏与内容视图分开设置动画,因此您可以翻转两个部分而不是整个屏幕。我原本试图这样做:
[UIView transitionFromView:src.navigationController.view
toView:dst.navigationController.view
但是失败是因为1)目的地的navigationController属性甚至没有被设置,直到它被推到导航控制器上,2)即使它是我指的是同一个视图!我忘记了
导航控制器的视图只是几个容器 其他视图,包括导航栏,可选工具栏和 视图包含您的自定义内容...虽然内容 导航栏和工具栏视图的变化,视图本身就做了 不...导航控制器对象构建的内容 导航栏动态使用导航项(实例) 与视图控制器关联的UINavigationItem类) 导航堆栈。要更改导航栏的内容, 因此,您必须为自定义视图配置导航项 控制器。 (docs)
答案 1 :(得分:0)
另一个“狡辩”? 我把
[src.navigationController pushViewController:dst animated:YES];
前
[UIView transitionFromView ...
以便在目标的viewDidLoad方法中可以访问导航控制器。