编辑:我解决了我的问题,但我有兴趣了解为什么我的修复有效。见下文。
我使用自动布局来构建我的 UITableViewCell
s。
单元格非常简单,有 2 个标签(紫色和黄色)和一个文本字段(绿色)。
这在第一次显示时工作正常。但是当我推送一个新的 View Controller 时, View 会立即重新排列。无论出于何种原因,紫色标签都会变大。
这是我单击“父帐户 ID”单元格以推送新 View Controller 的示例。请注意,一旦过渡开始,布局就会发生变化。回来的时候还是变了。
这些项目是用 [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
改变它的大小!
最佳答案
您的修复有效,因为它强制执行缺少的约束。
首先,让我们先写下您使用 Masonry 创建的约束:
这可能看起来很完整,但它允许自动布局以多种不同的方式绘制您的 View 。
考虑以下:



根据您在上面创建的规则,所有三种可能性都为真。
当您点击单元格时,布局将失效并重新绘制。鉴于您的单元格可以通过几种不同的方式绘制,它只会绘制自己并满足您的所有约束......它确实如此。
老实说,我不是 100% 确定是什么
make.edges.equalTo(self);
确实如此,因为它有点模棱两可。但是,可以肯定的是,它添加了您正在寻找的缺失约束。可能缺少的约束是:
希望这可以为您澄清。
关于ios - 推送新的 View Controller 时自动布局高度会发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25201353/