加载视图时导航栏跳跃

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】:

NavigationControllerContainer 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 都没有将焦点设置在导航栏标题上

关闭模态视图后的状态栏和导航栏问题

当隐藏状态栏时,有没有办法防止布局“跳跃”?