自动布局:指定视图和导航栏之间的间距

Posted

技术标签:

【中文标题】自动布局:指定视图和导航栏之间的间距【英文标题】:Autolayout: Specify spacing between view and navigation bar 【发布时间】:2014-05-05 17:57:44 【问题描述】:

我试图弄清楚我应该设置哪些约束来将视图放置在导航栏下方。问题是它的高度取决于当前的方向(纵向 44,横向 32),所以我不能使用确切的数字。

有什么特殊值可以用于约束吗?

【问题讨论】:

【参考方案1】:

看到突出显示的顶部约束了吗?这将让您设置与相邻视图的固定距离。问题是您的导航栏可能位于嵌入式视图的顶部,这意味着您需要取消选中“顶部栏下方”设置,然后您才能为顶部布局管理器设置约束。

【讨论】:

我假设“Extend Edges”部分仅在 Storyboard 模式下可用,因为我似乎无法在简单的 Xib 编辑器中找到它。 无论如何,如果我想让我的背景在导航栏下怎么办?在这种情况下如何指定间距? 它也应该在 XIB 文件中,但它是控制器的一部分,而不是视图的一部分,并且大多数人只有在使用 Storyboard 时才会为添加控制器而烦恼。尽管UIViewController 有一个topLayoutGuide 属性,但您可以通过编程方式完成,然后只需将自动布局距离设置为XIB 文件中视图的顶部。 感谢您的指点。我会在弄清楚如何以编程方式指定约束后立即尝试。 Hmmmm...在这种情况下,您可能需要这样的东西: BOOL isLandscape() return UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]); 【参考方案2】:

这正是 ios 7 提供 Top Layout GuideBottom Layout Guide 的原因,相对于它们创建你的约束,正确的事情就会发生。

【讨论】:

边缘在导航栏下方延伸时是否支持顶部布局指南?我注意到布局指南仅在关闭时显示为 IB Autolayout 中的对象......只是假设布局指南和框架边缘相同吗? 如果边缘在条下方延伸,那么是的,框架边缘和布局指南是相同的。【参考方案3】:

使用顶部和底部布局指南创建约束可能是正确的解决方案,但它们仅在情节提要模式下可用。

如果它们不可用(或由于某种原因不工作),解决方案如下:

    创建相对于超级视图顶部的约束(此时实际值并不重要,我们将在代码中设置它)。 为步骤 1 中的约束创建出口(与创建视图的方式相同)。 修改您的视图控制器代码:
 
- (void)viewDidLoad 
    //initial setup
    UIInterfaceOrientation currentOrientation = [UIApplication sharedApplication].statusBarOrientation;
    [self applyTopBarOffsetForOrientation:currentOrientation];


- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    [self applyTopBarOffsetForOrientation:toInterfaceOrientation];


- (void)applyTopBarOffsetForOrientation:(UIInterfaceOrientation) orientation 
    BOOL isPhone = [UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone;
    self.topBarSpacingConstraint.constant = UIDeviceOrientationIsLandscape(orientation) && isPhone ? 52 : 64;


【讨论】:

以上是关于自动布局:指定视图和导航栏之间的间距的主要内容,如果未能解决你的问题,请参考以下文章

xib 中的自动布局 - 子视图的高度与导航栏和标签栏之间的空间成正比

自动布局等间距和加权间距

在代码中更改框架后自动布局重置视图

启用自动布局的 iOS 调整视图大小

如何使用自动布局在两个子视图控制器之间移动?

垂直自动布局子视图