当我按下新的视图控制器时,Autolayout高度会发生变化

Jon*_*nas 6 uitableview ios autolayout

编辑:我解决了我的问题,但我有兴趣了解为什么我的修复工作.见下文.

我使用autolayout来构建我UITableViewCell的.

单元格非常简单,有2个标签(紫色和黄色)和文本字段(绿色).

我的手机

这在第一次显示时工作正常.但是当我推动一个新的视图控制器时,视图会立即重新排列.无论出于何种原因,紫色标签都会变大.

这是一个示例,我单击"父帐户ID"单元格以推送新的视图控制器.请注意,一旦转换开始,布局就会发生变化.当我回来时它仍然改变了.

细胞动画gif

这些项目是在[UILabel new]没有框架的情况下创建的.

[self.contentView addSubview:self.textLabel];
[self.contentView addSubview:self.errorLabel];
[self.contentView addSubview:self.textField];
Run Code Online (Sandbox Code Playgroud)

然后使用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);
}];
Run Code Online (Sandbox Code Playgroud)

请注意,我从未指定高度,因为我并不关心高度.(只要它是一致的!)

知道为什么这会改变吗?谢谢

编辑:我发现了一个修复程序.

我现在还设置了autolayout属性contentView.

[self.contentView makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(self);
}];
Run Code Online (Sandbox Code Playgroud)

我仍然有兴趣了解为什么contentView改变它的大小!

bsa*_*zin 1

您的修复之所以有效,是因为它强制执行了缺失的约束。

首先,让我们首先写下您使用 Masonry 创建的约束:

  1. 紫色视图必须左对齐。
  2. 紫色视图必须顶部对齐。
  3. 紫色视图的宽度可能会有所不同,但它的最小和最大并不那么重要。
  4. 黄色视图必须右对齐。
  5. 黄色视图必须顶部对齐。
  6. 黄色视图的左边缘必须距紫色视图的右边缘 5 像素。
  7. 绿色视图必须左对齐。
  8. 绿色视图必须底部对齐。
  9. 绿色视图必须右对齐。
  10. 绿色视图的顶部边缘与紫色视图的底部边缘的距离必须为 0px。

这可能看起来很完整,但它允许自动布局以多种不同的方式绘制您的视图。

考虑以下:


根据您上面创建的规则,所有三种可能性都是正确的。当您点击单元格时,布局将失效并重新绘制。鉴于您的单元格可以通过几种不同的方式绘制,它会简单地绘制自身并满足您的所有约束......并且确实如此。

老实说,我不能 100% 确定make.edges.equalTo(self);到底是什么,因为它有点模糊。然而,可以肯定的是,它增加了您正在寻找的缺失约束。

可能缺少的约束是:

  1. 紫色视图的高度必须等于绿色视图的高度。
  2. 黄色视图的高度必须等于紫色视图的高度。
  3. 绿色视图的高度必须等于黄色视图的高度。

希望这能为您澄清。