自定义视图控制器展示导致导航栏弹跳

Posted

技术标签:

【中文标题】自定义视图控制器展示导致导航栏弹跳【英文标题】:Custom view controller presentation causes the navigation bar to bounce 【发布时间】:2014-04-28 23:53:44 【问题描述】:

我正在使用从我的根视图控制器模态转换委托呈现一个视图控制器。

UIWindow *window = [[[UIApplication sharedApplication] delegate] window];
UIViewController *rootVC = [window rootViewController];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:authVC];
navController.modalPresentationStyle = UIModalPresentationCustom;
navController.navigationBar.translucent = NO;
navController.transitioningDelegate = self;
[rootVC presentViewController:navController animated:YES completion:nil];

我的转换委托添加如下视图,其中authorizationVC 是截图中的登录视图。

UIView *containerView = [transitionContext containerView];
[containerView addSubview:blurredView];
[containerView insertSubview:_authorizationVC.view aboveSubview:blurredView];

_authorizationVC.view.frame = CGRectMake(10, 30, 300, 450);

首先,视图动画化,导航栏全高,我认为是 64 像素(导航栏 44 像素,状态栏 20 像素)。

我的动画一完成,导航栏就会缩小到 44 像素。这种转变令人不安。我的视图控制器中的内容不受影响。

如何避免这个抖动的导航栏?第二张图片是我想要实现的。

【问题讨论】:

【参考方案1】:

在将视图添加到其父视图之前设置视图的所有属性。

UIView *containerView = [transitionContext containerView];
_authorizationVC.view.frame = CGRectMake(10, 30, 300, 450); /// Change the frame FIRST!

[containerView addSubview:blurredView];
[containerView insertSubview:_authorizationVC.view aboveSubview:blurredView];

瞧!导航栏按预期工作。

【讨论】:

【参考方案2】:

如果你真的不需要UINavigationController,我会避免使用它。

UINavigationController 在调整导航栏大小时会考虑到topLayoutGuide。如果您只想要彩色条和关闭按钮,我会对其进行简化并使用您自己的视图。

如果您必须使用UINavigationController,您可以尝试使用状态栏的外观,看看它如何影响导航控制器的呈现。

【讨论】:

以上是关于自定义视图控制器展示导致导航栏弹跳的主要内容,如果未能解决你的问题,请参考以下文章

视图控制器之间的自定义转换,包括导航栏

如何将自定义导航栏链接到导航控制器?

弹出视图时不恢复自定义导航栏背景

单击导航栏中的“返回”按钮时如何设置自定义视图控制器?

自定义底部栏过渡到 Swift 中的另一个视图?

自定义大小的表格视图仍然使用导航栏的偏移量