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

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

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

【问题讨论】:

    标签: ios autolayout


    【解决方案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. 创建相对于超级视图顶部的约束(此时实际值并不重要,我们将在代码中设置它)。
    2. 为步骤 1 中的约束创建出口(与创建视图的方式相同)。
    3. 修改您的视图控制器代码:
     
    - (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;
    }
    
    

    【讨论】: