UINavigationBar旋转和自动布局

时间:2013-10-24 20:37:43

标签: ios rotation uinavigationbar autolayout

关于通过在场景中插入UINavigationBar来设计自己的视图控制器,我发现了很多关于旋转设备时帧高度如何变化的问题的参考。这与Apple在其导航控制器中使用UINavigationBar的方式形成对比,其中条形的高度在旋转时会发生变化。

虽然有些建议事实上显示如何更改高度以与Apple所做的一致,但所有答案都没有解决与场景中其他视图的正确关系。特别是,在构建利用autoLayout的场景时,您永远不必调整帧 - 自动布局假设通过您定义的约束来处理这个问题。

例如,一个suggestion就是这样做的:

- (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

然后切换到肖像:

enter image description here

是否有人知道Apple希望我们如何使用约束来解决UINavigationBar布局?

1 个答案:

答案 0 :(得分:1)

只需在按钮和顶部布局指南之间建立垂直间距约束即可。这可以通过控制从按钮拖动到导航栏的底部在IB中完成。非常简单,无需代码。

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

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