代码中的Autolayout?高度问题?

时间:2015-06-11 12:27:28

标签: ios autolayout

enter image description here

我有两个视图说view1和view2。
- view2应与view1(垂直)和
的距离为2像素 - view2的高度应该是view2的底部必须与viewcontroller的底部相同。

如何在代码中为此指定约束?

1 个答案:

答案 0 :(得分:1)

由于我不知道您在视图层次结构中已有的内容,因此我设置了一个简单的示例。看看这段代码。它创建了两个新的UIViews并使用约束来定位它们。

- (void)viewDidLoad {
    [super viewDidLoad];

    UIView *view1 = [UIView new];
    UIView *view2 = [UIView new];

    view1.backgroundColor = [UIColor redColor];
    view2.backgroundColor = [UIColor blueColor];

    [self.view addSubview:view1];
    [self.view addSubview:view2];

    [view1 setTranslatesAutoresizingMaskIntoConstraints:NO];
    [view2 setTranslatesAutoresizingMaskIntoConstraints:NO];

    NSDictionary *views = NSDictionaryOfVariableBindings(view1, view2);

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(100)-[view1(200)]-(2)-[view2]|" options:0 metrics:0 views:views]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[view1]|" options:0 metrics:0 views:views]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[view2]|" options:0 metrics:0 views:views]];

}

结果如下:

enter image description here

代码并不难理解。 + constraintsWithVisualFormat:方法会创建一个NSLayoutConstraint数组,您可以将其添加到自定义视图的超级视图中。有关可视格式语言的更多信息,请查看here。它在简单布局方面非常有效,与逐个创建约束相比,节省了大量时间。

如果您真的想要使用constraintWithItem:方法创建约束,请在此处输入您的代码:

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:100]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:view2 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:view1 attribute:NSLayoutAttributeBottom multiplier:1 constant:2]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:view2 attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1 constant:0]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:0]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTrailing multiplier:1 constant:0]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:view2 attribute:NSLayoutAttributeWidth multiplier:1 constant:0]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:200]];

它会产生相同的约束,但会占用两倍的空间并且难以阅读。所以我强烈建议您使用可视格式。您应该只使用constraintWithItem:进行更复杂的布局,视觉格式无法始终处理。