3

关于通过在场景中插入 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 布局?

4

1 回答 1

1

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

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

- (void)viewWillLayoutSubviews {
    self.heightCon.constant = (self.view.bounds.size.height > self.view.bounds.size.width)? 44 : 32;
}
于 2013-10-24T20:51:33.547 回答