我有两个 View ,比如 view1 和 view2。
- view2 应该与 view1 相距 2 像素(垂直)并且
- view2 的高度应使 view2 的底部必须与 viewcontroller 的底部相同。
如何在代码中为此指定约束?
最佳答案
由于我不知道您的 View 层次结构中已有什么,所以我设置了一个简单的示例。查看这段代码。它创建两个新的 UIView 并使用约束定位它们。
- (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]];
}
结果如下:
代码并不难理解。 + constraintsWithVisualFormat:
方法创建一个 NSLayoutConstraint
数组,您可以将其添加到自定义 View 的父 View 中。看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:
。
关于ios - 代码中的自动布局?高度问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30780762/