关于通过将 UINavigationBar 插入场景来设计自己的视图控制器,我发现了许多关于旋转设备时框架高度如何不改变的问题的参考。这与 Apple 在其导航控制器中使用 UINavigationBar 的方式形成鲜明对比,其中导航栏的高度在旋转时会发生变化。
虽然确实有一些建议确实展示了如何更改高度以与 Apple 的做法保持一致,但所有答案都没有解决与场景中其他视图的正确关系。特别是,在构建使用自动布局的场景时,您永远不必调整框架 - 自动布局应该通过您定义的约束来为您处理这个问题。
例如,一个建议是为了这样做:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
[self.navigationBar performSelector:@selector(sizeToFit) withObject:nil afterDelay:(0.5f * duration)];
}
虽然这会改变大小,但与其他视图的关系不再正确。尽管上面示例中的海报确实提供了一种解决方案来调整关系,但这更多的是一种硬编码方法,苹果可能不会建议,即不是一种自动布局友好的解决方案。
通过实验,我注意到,当旋转设备时,intrinsicContentSize 实际上确实发生了正确的变化,但框架却没有。注意到这一点后,我尝试了以下操作:
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
CGRect frame = self.navigationBar.frame;
frame.size.height = self.navigationBar.intrinsicContentSize.height;
self.navigationBar.frame = frame;
}
虽然这确实正确地改变了大小,就像上面的例子一样,但它也导致了不正确的视图关系。
具体来说,我的横向设备:
![enter image description here](https://i.stack.imgur.com/S3yyy.png)
然后切换到纵向:
![enter image description here](https://i.stack.imgur.com/Fjokz.png)
有谁知道苹果希望我们如何使用约束来解决 UINavigationBar 布局?
只需在按钮和顶部布局指南之间设置垂直间距约束即可。这可以在 IB 中通过将控件从按钮拖动到导航栏底部来完成。非常简单,无需任何代码。
编辑后:如果您添加独立的导航栏,则确实需要一些代码(据我所知)来获得使用导航控制器自动获得的行为。我这样做的方法是添加一个导航栏,并为其提供对超级视图侧面的约束、对顶部布局指南的垂直约束以及 44 点的固定高度。我针对此约束创建了一个 IBOutlet(在下面的代码中称为 heightCon)。该按钮具有 centerX 约束和导航栏的垂直间距约束。
- (void)viewWillLayoutSubviews {
self.heightCon.constant = (self.view.bounds.size.height > self.view.bounds.size.width)? 44 : 32;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)