加载视图时导航栏跳跃
Posted
技术标签:
【中文标题】加载视图时导航栏跳跃【英文标题】:NAvigationbar jumping when loading view 【发布时间】:2012-06-04 08:15:55 【问题描述】:我已经实现了一个容器视图控制器 (ios5),现在我尝试实现自定义动画/过渡以切换视图控制器。
但是在实现任何涉及 UINavigationController 的动画时,我遇到了一个问题,结果不符合预期。例如,如果我在显示带有导航栏的控制器时执行从左侧翻转的动画,导航栏的位置会保持在原始位置下方 44pxs 并且在执行动画后导航栏将平滑地移动到原始位置,这确实是丑……
我执行的每个动画都会发生这种情况,所以我猜它必须只与导航控制器相关。
这是我用于翻转过渡的代码
[self transitionFromViewController:fromViewController
toViewController:toViewController
duration:1.0
options:UIViewAnimationOptionTransitionNone
animations:^
[UIView beginAnimations:@"animation2" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration: 0.7];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:containerView cache:NO];
[UIView commitAnimations];
completion:^(BOOL finished)
[toViewController didMoveToParentViewController:self];
[fromViewController removeFromParentViewController];
];
我也尝试了以下
[self transitionFromViewController:fromViewController
toViewController:toViewController
duration:1.0
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^
completion:^(BOOL finished)
[toViewController didMoveToParentViewController:self];
[fromViewController removeFromParentViewController];
];
【问题讨论】:
【参考方案1】:根据iphone或ipad的设置导航栏的边框,iphone中的竖屏这样设置导航栏的方向
[self.navigationController.navigationBar setFrame:CGRectMake(0, 20, 320, 44)]; //for iphone simarly for ipad and its orientation
您需要将导航栏框架从状态栏更改为实际位置,即加 20
【讨论】:
我忘了评论整个内容都向上移动了,所以如果我设置导航栏框架,内容视图仍然会移动。我尝试设置两个框架(导航栏和内容视图),但只有导航栏移动到原始位置。 我刚刚检查了导航栏的框架及其在 viewDidLoad 和 viewWillAppear (x = 0, y =0) 中的正确性。即使导航栏从 y = 状态栏高度移动到 y = 0...奇怪... 为什么?它假设 NavigationController 和导航栏都有一个原点 x=0 和 y=0 的框架,不是吗? 但随着它的改变,我们改变了 y = 20 的原点 我不明白你的意思。如果我更改 origin.y = 20,该栏将放置在 y=20,所以是的,不会跳转到 origin.y = 0,但是状态栏和导航栏之间会出现一个空格。【参考方案2】:NavigationController
和 Container controller
也有类似的问题。实际上它是窗口底部的工具栏。我的解决方案是先隐藏工具栏,然后在主转换完成后显示带有动画的工具栏。它看起来像是整个动画的一部分。
这里是我如何隐藏和显示工具栏:
[toNavController setToolbarHidden:YES];
[self transitionFromViewController:fromViewController
toViewController:toNavController
duration:1.0
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^
completion:^(BOOL finished)
[toNavController didMoveToParentViewController:self];
[fromViewController removeFromParentViewController];
[toNavController setToolbarHidden:NO animated:YES];
];
【讨论】:
【参考方案3】:在 viewDidLoad 中将 frame.origin.y 设置为 1。你仍然有跳跃但有 1 个像素。
【讨论】:
以上是关于加载视图时导航栏跳跃的主要内容,如果未能解决你的问题,请参考以下文章
React Native 标题/底部标签栏在第一个应用程序加载时跳跃
画外音:每次加载视图时,ViewWillAppear 中的 UIAccessibilityLayoutChangedNotification 都没有将焦点设置在导航栏标题上