UINavigationBar旋转和自动布局

关于通过在场景中插入UINavigationBar来devise自己的视图控制器,我发现许多关于旋转设备时帧高度不会改变的问题的参考。 这与苹果如何在其导航控制器中使用UINavigationBar的情况形成鲜明对比。

虽然有些build议事实上显示了如何改变高度以符合苹果的做法,但所有的答案都不能解决与现场其他观点的适当关系。 特别是在构build一个使用autoLayout的场景时,你不应该调整框架 – 自动布局是通过你定义的约束为你设置的。

例如,一个build议是这样做的:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { [self.navigationBar performSelector:@selector(sizeToFit) withObject:nil afterDelay:(0.5f * duration)]; } 

虽然这将改变大小,但与其他观点的关系不再正确。 尽pipe上面例子中的海报确实提供了一个解决调整关系的解决scheme,但这更像是一种硬编码的方法,并非苹果公司可能提出的一种方法,也就是说,它不是一个autoLayout友好的解决scheme。

通过实验,我注意到在旋转设备时,intrinsicContentSize事实上确实改变了,但是框架没有改变。 注意到这一点,我尝试了以下几点:

 - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; CGRect frame = self.navigationBar.frame; frame.size.height = self.navigationBar.intrinsicContentSize.height; self.navigationBar.frame = frame; } 

虽然这确实改变了大小,就像上面的例子一样,它也导致了不正确的视图关系。

具体来说,我的横向设备:

在这里输入图像说明

然后切换到肖像:

在这里输入图像说明

有谁知道苹果如何使用约束来解决UINavigationBar布局问题?

只需在button和顶部布局指南之间进行垂直间距约束。 这可以在IB中通过控制从button拖动到导航栏的底部来完成。 非常简单,没有必要的代码。

编辑之后:如果你添加一个独立的导航栏,你确实需要一些代码(据我所知)来获得自动导航控制器的行为。 我这样做的方式是添加一个导航栏,并将其限制到超视图的两侧,对顶部布局指南的垂直限制以及44点的固定高度。 我做了一个IBOutlet这个约束(在下面的代码中称为heightCon)。 该button对导航栏具有centerX约束和垂直间距约束。

 - (void)viewWillLayoutSubviews { self.heightCon.constant = (self.view.bounds.size.height > self.view.bounds.size.width)? 44 : 32; }