Ios UINavigationBar旋转和自动布局

Ios UINavigationBar旋转和自动布局,ios,rotation,uinavigationbar,autolayout,Ios,Rotation,Uinavigationbar,Autolayout,关于通过在场景中插入UINavigationBar来设计自己的视图控制器,我发现了许多关于旋转设备时帧高度如何不改变的问题。这与苹果在其导航控制器中使用UINavigationBar的方式形成了对比,在导航控制器中,导航条的高度在旋转时会发生变化 虽然有一些建议确实说明了如何改变高度,使其与苹果的做法一致,但所有的答案都没有说明与场景中其他视图的正确关系。特别是,在构建使用“自动布局”的场景时,您不必调整帧-自动布局将通过您定义的约束为您解决这一问题 例如,一个是这样做的: - (void)wi

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

虽然有一些建议确实说明了如何改变高度,使其与苹果的做法一致,但所有的答案都没有说明与场景中其他视图的正确关系。特别是,在构建使用“自动布局”的场景时,您不必调整帧-自动布局将通过您定义的约束为您解决这一问题

例如,一个是这样做的:

- (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;
}
虽然这确实正确地改变了大小,如上面的示例,但它也导致了不正确的视图关系

具体而言,我的设备在横向:

然后切换到纵向:


有人知道苹果希望我们如何使用约束来解决UINavigationBar布局问题吗?

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

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

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

是的,这个建议将有助于上面的例子。然而,代码是必要的,因为导航栏的高度需要调整-这才是文章的重点。另外,我们的目标是在条大小改变时保持按钮和条之间的空间。@zinc1oxide,看起来他说的是iPhone旋转时自动获得的高度变化——不需要代码。旋转时没有自动高度变化。在上述建议中,更改按钮约束不会影响旋转时导航栏的高度。如果你知道一种通过定义约束来改变高度的方法,那将是理想的。@Zincoxide,我不知道你看到了什么,但在我的手机和模拟器(7.0版)上,导航栏的纵向高度为44点,横向高度为32点——这是自动发生的,这是iPhone上导航栏的正常行为。@zincoxide,好的,我知道你现在在做什么。我已经更新了我的答案。