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

时间:2014-08-08 10:26:06

标签: ios uitableview autolayout

编辑我解决了我的问题,但我有兴趣了解我的修复工作原因。见下文。

我使用autolayout来构建我的UITableViewCell

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

my cell

第一次显示时效果很好。但是当我推动一个新的视图控制器时,视图会立即重新排列。无论出于何种原因,紫色标签都会变大。

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

cell animation gif

这些项目是使用[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改变其大小的原因!

1 个答案:

答案 0 :(得分:1)

您的修复有效,因为它强制执行缺少的约束。

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

  1. 紫色视图必须左对齐。
  2. 紫色视图必须对齐顶部。
  3. 紫色视图的宽度可能会有所不同,但它的最小值和最大值并不重要。
  4. 黄色视图必须右对齐。
  5. 黄色视图必须对齐顶部。
  6. 黄色视图的左边缘必须距紫色视图的右边缘5px。
  7. 绿色视图必须左对齐。
  8. 绿色视图必须对齐底部。
  9. 绿色视图必须正确对齐。
  10. 绿色视图的上边缘必须距紫色视图的下边缘0px。
  11. 这似乎已经完成,但它允许自动布局以多种不同方式绘制您的视图。

    请考虑以下事项:


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

    我说实话,我并非100%确定make.edges.equalTo(self);究竟做了什么,因为它有点含糊不清。但是,有一点可以肯定的是它会添加您正在寻找的缺失约束。

    可能缺少的约束是:

    1. 紫色视图的高度必须等于绿色视图的高度。
    2. 黄色视图的高度必须等于紫色视图的高度。
    3. 绿色视图的高度必须等于黄色视图的高度。
    4. 希望这能为你澄清。