编辑我解决了我的问题,但我有兴趣了解我的修复工作原因。见下文。
我使用autolayout来构建我的UITableViewCell
。
单元格很简单,有2个标签(紫色和黄色)和文本字段(绿色)。
第一次显示时效果很好。但是当我推动一个新的视图控制器时,视图会立即重新排列。无论出于何种原因,紫色标签都会变大。
以下是我点击"父帐户ID"的示例。单元格推送新的视图控制器。请注意,一旦转换开始,布局就会发生变化。当我回来时它仍然会改变。
这些项目是使用[UILabel new]
创建的,没有框架。
[self.contentView addSubview:self.textLabel];
[self.contentView addSubview:self.errorLabel];
[self.contentView addSubview:self.textField];
然后使用Masonry创建自动布局。
UIEdgeInsets insets = UIEdgeInsetsMake(3, 15, 3, 15);
[self.textLabel makeConstraints:^(MASConstraintMaker *make) {
make.left.top.equalTo(self.contentView).insets(insets);
make.width.priorityLow();
}];
[self.errorLabel makeConstraints:^(MASConstraintMaker *make) {
make.top.right.equalTo(self.contentView).insets(insets);
make.left.equalTo(self.textLabel.right).offset(5);
}];
[self.textField makeConstraints:^(MASConstraintMaker *make) {
make.left.bottom.right.equalTo(self.contentView).insets(insets);
make.top.equalTo(self.textLabel.bottom).insets(insets);
}];
请注意,我从未指定身高,因为我并不真正关心身高。 (只要它是一致的!)
知道为什么这会改变吗?感谢
我现在还设置了contentView
的自动布局属性。
[self.contentView makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self);
}];
我仍然有兴趣了解contentView
改变其大小的原因!
答案 0 :(得分:1)
您的修复有效,因为它强制执行缺少的约束。
首先,让我们开始写下你使用Masonry创建的约束:
这似乎已经完成,但它允许自动布局以多种不同方式绘制您的视图。
请考虑以下事项:
根据您在上面创建的规则,所有三种可能性都是正确的。 当您点击单元格时,布局将失效并重新绘制。鉴于您的单元格可以通过几种不同的方式绘制,它将简单地绘制自己并满足您的所有约束......并且确实如此。
我说实话,我并非100%确定make.edges.equalTo(self);
究竟做了什么,因为它有点含糊不清。但是,有一点可以肯定的是它会添加您正在寻找的缺失约束。
可能缺少的约束是:
希望这能为你澄清。