我试图以编程方式制作约束。我在IB中创建了textField和button。这是代码:
UIView *superview = self.view;
self.button.translatesAutoresizingMaskIntoConstraints = NO;
self.textField.translatesAutoresizingMaskIntoConstraints = NO;
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self.textField
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:superview
attribute:NSLayoutAttributeCenterY
multiplier:1.0f
constant:0];
[superview addConstraint:constraint];
constraint = [NSLayoutConstraint constraintWithItem:self.textField
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:superview
attribute:NSLayoutAttributeCenterX
multiplier:1.0f
constant:0];
[superview addConstraint:constraint];
constraint =[NSLayoutConstraint constraintWithItem:self.button
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:self.textField
attribute:NSLayoutAttributeLeading
multiplier:1
constant:-10];
[superview addConstraint:constraint];
constraint =[NSLayoutConstraint constraintWithItem:self.button
attribute:NSLayoutAttributeBaseline
relatedBy:NSLayoutRelationEqual
toItem:self.textField
attribute:NSLayoutAttributeBaseline
multiplier:1
constant:0];
[superview addConstraint:constraint];
运行后我遇到了这个问题: 约束也对视图没有影响。 我做错了什么?
答案 0 :(得分:2)
首先在故事板编辑器中选择要更改的视图控制器,然后在约束编辑器中选择“在视图控制器中添加缺少的约束” 通过重新构建和添加新约束来选择要在运行时修改的元素,在对象检查器面板中选择每个约束并通过选中“占位符:在构建时删除”框来编辑它。
这是对故事板编辑说的一种方式,你可以不应用约束蚂蚁,或者抱怨约束条件不足。
标记的约束在运行时被删除,因此您应该提供自己的约束,如果您在正确的位置执行,则更好。视图控制器中的Ovverride -updateViewConstraints
并记得调用super并添加新约束。
答案 1 :(得分:0)
您有三个自动生成的约束“在构建时为具有固定帧的视图生成的IB自动生成”。这些与你自己制造的冲突。您可能已在Interface Builder中的文本字段和按钮上设置了固定大小属性。可能,您的按钮上有一个固定的宽度,并且与尾随约束冲突。
将IB与代码约束相结合可能会非常棘手。我发现通常只在IB中或仅在代码中设计东西以避免像这样的冲突更容易,尽管将两者结合起来是完全可行的。
有关NSIBPrototypingLayoutConstraint
的详细解释,请查看此SO答案:
Trouble with AutoLayout on UITableViewCell