关于通过在场景中插入 UINavigationBar 来设计您自己的视图控制器,我发现许多关于旋转设备时帧高度如何不改变的问题的参考。这与 Apple 在其导航控制器中利用 UINavigationBar 的方式形成对比,其中栏的高度在旋转时会发生变化。
虽然有一些建议实际上显示了如何改变高度以与 Apple 所做的一致,但所有答案都没有解决与场景中其他视图的正确关系。特别是,在构建使用 autoLayout 的场景时,您永远不必调整框架 - 假设自动布局会通过您定义的约束为您解决这个问题。
例如,一个建议是这样做:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
[self.navigationBar performSelector:@selector(sizeToFit) withObject:nil afterDelay:(0.5f * duration)];
}
虽然这会改变大小,但与其他视图的关系不再正确。尽管上面示例中的海报确实提供了一种解决关系调整的解决方案,但这更像是一种硬编码方法,Apple 可能不会建议,即不是一个对自动布局友好的解决方案。
通过实验,我注意到在旋转设备时,intrinsicContentSize 实际上确实发生了正确的变化,但框架没有。注意到这一点,我尝试了以下方法:
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
CGRect frame = self.navigationBar.frame;
frame.size.height = self.navigationBar.intrinsicContentSize.height;
self.navigationBar.frame = frame;
}
虽然这确实正确地改变了大小,就像上面的例子一样,但它也导致了不正确的视图关系。
具体来说,我的横向设备:
然后切换到纵向:
有谁知道 Apple 希望我们如何使用约束来解决 UINavigationBar 布局?