在代码中为topLayoutGuide和bottomLayoutGuide创建自动布局约束

时间:2013-10-04 06:09:08

标签: ios autolayout nslayoutconstraint

Apple documentation关于在视图与其中一个布局指南之间创建自动布局约束仅显示使用VFL的示例。

有没有办法以编程方式不使用 VFL创建这些约束(使用NSLayoutConstraint's other API或类似)?

(注意:我特别要求在代码中执行此操作,而不是在Interface Builder中。我不希望指南集的计算length作为约束的静态常量,我想要一个约束,其中布局引导长度的更改将自动导致约束视图调整位置。)

4 个答案:

答案 0 :(得分:93)

对于UIButton您希望在UIViewController.topLayoutGuide以下20分的位置,您可以创建NSLayoutConstraint,如下所示:

[NSLayoutConstraint constraintWithItem:self.button
                             attribute:NSLayoutAttributeTop
                             relatedBy:NSLayoutRelationEqual
                                toItem:self.topLayoutGuide
                             attribute:NSLayoutAttributeBottom
                            multiplier:1.0
                              constant:20.0];

使用iOS 9,您还可以通过以下方式创建NSLayoutConstraint

[self.button.topAnchor constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor
                                      constant:20.0];

答案 1 :(得分:5)

为了补充@ JamieMcDaniel的答案,Swift + iOS9版本将是:

self.button.topAnchor
    .constraintEqualToAnchor( self.topLayoutGuide.bottomAnchor ).active = true

不要忘记.active = true部分,否则约束不会自动启动。

答案 2 :(得分:3)

这是我创建的gist,您应该将所有子视图嵌入到添加到xib中的tank视图(容器视图)中,它会删除tank view-superview xib约束并添加上限制topLayoutGuide给出iOS6外观。你希望实现的目标可能很有趣。

//This should be added before the layout of the view
- (void) adaptToTopLayoutGuide {
    //Check if we can get the top layoutguide
    if (![self respondsToSelector:@selector(topLayoutGuide)]) {
        return;
    }
    //tankView is a contaner view
    NSArray * array = [self.tankView referencingConstraintsInSuperviews]; //<--For this method get the Autolayout Demistified Book Sample made by Erica Sadun
    [self.view removeConstraints:array];
    NSArray * constraintsVertical = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topLayoutGuide]-0-[tankView]|" options:0 metrics:nil views:@{@"tankView": self.tankView, @"topLayoutGuide":self.topLayoutGuide}];
    [self.view addConstraints:constraintsVertical];
    NSArray * constraintsHorizontal = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tankView]|" options:0 metrics:nil views:@{@"tankView": self.tankView}];
    [self.view addConstraints:constraintsHorizontal];

}

答案 3 :(得分:3)

只是@Jamie McDaniel的补充,如果不是很明显,你需要添加他建议创建的约束:

NSLayoutConstraint *buttonTopConstraint = [NSLayoutConstraint constraintWithItem:self.button
                                 attribute:NSLayoutAttributeTop
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:self.topLayoutGuide
                                 attribute:NSLayoutAttributeBottom
                                multiplier:1.0
                                  constant:20.0];
[self.view addConstraint:buttonTopConstraint];