一段代码写的约束
- (void)setConstraints {
for (UIView *view in [self.contentView subviews]) {
view.translatesAutoresizingMaskIntoConstraints = NO;
}
NSDictionary *viewsDict = NSDictionaryOfVariableBindings(_titleLabel, _detailLabel, _nameLabel, _timeLabel, _commentLabel);
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-8-[_titleLabel]-5-[_detailLabel]"
options:NSLayoutFormatAlignAllLeft | NSLayoutFormatAlignAllRight
metrics:nil views:viewsDict]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_detailLabel]-5-[_nameLabel]-8-|"
options:NSLayoutFormatAlignAllLeft
metrics:nil views:viewsDict]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-8-[_titleLabel]-8-|"
options:0 metrics:nil views:viewsDict]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[_nameLabel]-10-[_timeLabel]-10-[_commentLabel]"
options:NSLayoutFormatAlignAllTop | NSLayoutFormatAlignAllBottom
metrics:nil views:viewsDict]];
}
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
用于view自适应宽和高;
今天碰到写了约束怎么都不对的,纠结几个小时才发现问题。
对每个要手动添加约束的view都要设置view.translatesAutoresizingMaskIntoConstraints = NO;
这里用了for view in self.contentView 遍历contentView里的子View,但是这只是contentView的subview,对于其中Subview的subview就没遍历到,所以,一定要注意所有的view都设置了translatesAutoresizingMaskIntoConstraints = No.
今天又代码写约束,总是有warning,然后又开始检查是哪里的约束出了问题,问题解决了,又是很愚蠢的错误,如下
我在添加约束时用了active constraint语句,这个语句不管是哪个view里的constraint都会加,即使我前面的代码有些错误,也不容易发现是何处的问题
NSLayoutConstraint.activateConstraints(allConstraints)
另外一种添加约束的语句是
self.addConstraints(allConstraints)
如果约束的对象不是self的subview,代码会crash,所以也比较容易发现这方面的错误,我今天的问题就是在于subview是self的subview还是self.contentView的subview搞混了,所以又花了一个小时来检查约束错误。
所以,具体subview是添加在哪个view上的一定要搞清楚。