我在UITableViewCell
中使用Masonry,该单元格有两个子视图,一个是contentLabel
,另一个是imageView
。虽然imageView
并不总是存在,但如果单元格有一个图像url,则显示或隐藏它。如果imageView
被隐藏,我想将contentLabel
到cell.contentView.bottom
设置为另一个值,如下所示:
[_contentLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.contentView.mas_left);
make.top.equalTo(self.contentView.mas_bottom).offset(20);
make.right.equalTo(self.contentView.mas_right).offset(-6);
_bottomConstraint = make.bottom.equalTo(_imageView.mas_top).offset(-14);
}];
[_imageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(_contentLabel.mas_left);
make.bottom.equalTo(self.contentView.mas_bottom).offset(-14);
}];
if (tweet.imageUrl) {
_imageView.hidden = NO;
[_imageView sd_setImageWithURL:tweet.imageUrl placeholderImage:[UIImage imageNamed:@"loading"] options:0];
} else {
_imageView.hidden = YES;
[_imageView sd_setImageWithURL:NULL];
}
if (_imageView.hidden) {
[_contentLabel mas_updateConstraints:^(MASConstraintMaker *make) {
make.bottom.equalTo(_imageView.mas_top).offset(0);
}];
}
但我总是收到下面的错误消息:
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<MASLayoutConstraint:0x7fef9cd178d0 UILabel:0x7fef9cd437e0.bottom == UIImageView:0x7fef9cd26260.top - 14>",
"<MASLayoutConstraint:0x7fef9caf5430 UILabel:0x7fef9cd437e0.bottom == UIImageView:0x7fef9cd26260.top>"
)
Will attempt to recover by breaking constraint
<MASLayoutConstraint:0x7fef9caf5430 UILabel:0x7fef9cd437e0.bottom == UIImageView:0x7fef9cd26260.top>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
mas_updateConstraints
似乎没有删除旧的约束,而是添加了一个新的约束,两者相互冲突。那么,如何在运行时动态更新约束值呢?
也许这不是你的问题,但它可能会帮助其他人:
我的问题主要如下:
我首先给UIView
:的一个子类分配了一个高度约束
make.height.equalTo(label); // label is another subclass of UIView
后来,我尝试使用"更新"此约束
make.height.equalTo(@(newHeight)); // newHeight is a CGFloat
这保留了原来的约束,并添加了一个与第一个约束冲突的新约束。
然后,我将第一个约束的分配更改为:
CGFloat labelHeight = label.frame.size.height;
make.height.equalTo(@(labelHeight));
…冲突结束了
显然,iOS Masonry无法将UIView
定义的约束更新为NSNumber
定义的约束。