ios - 推送新的 View Controller 时自动布局高度会发生变化

原文 标签 ios uitableview autolayout

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

我使用自动布局来构建我的 UITableViewCell s。

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

my cell

这在第一次显示时工作正常。但是当我推送一个新的 View Controller 时, View 会立即重新排列。无论出于何种原因,紫色标签都会变大。

这是我单击“父帐户 ID”单元格以推送新 View Controller 的示例。请注意,一旦过渡开始,布局就会发生变化。回来的时候还是变了。

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改变它的大小!

最佳答案

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

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

  • 紫色 View 必须左对齐。
  • 紫色 View 必须在顶部对齐。
  • 紫色 View 的宽度可能会有所不同,但最小和最大并不那么重要。
  • 黄色 View 必须右对齐。
  • 黄色 View 必须在顶部对齐。
  • 黄色 View 的左边缘必须与紫色 View 的右边缘相距 5px。
  • 绿色 View 必须左对齐。
  • 绿色 View 必须在底部对齐。
  • 绿色 View 必须右对齐。
  • 绿色 View 的顶部边缘必须与紫色 View 的底部边缘相距 0px。

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

    考虑以下:




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

    老实说,我不是 100% 确定是什么 make.edges.equalTo(self);确实如此,因为它有点模棱两可。但是,可以肯定的是,它添加了您正在寻找的缺失约束。

    可能缺少的约束是:
  • 紫色 View 的高度必须等于绿色 View 的高度。
  • 黄色 View 的高度必须等于紫色 View 的高度。
  • 绿色 View 的高度必须等于黄色 View 的高度。

  • 希望这可以为您澄清。

    关于ios - 推送新的 View Controller 时自动布局高度会发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25201353/

    相关文章:

    使用 ios 5 的 iphone 5 NIB

    ios - 如何快速获取时间戳记间隔?

    ios - 以AAC格式录制和播放音频iOS 5 +

    ios - Swift - 类型转换

    ios - 插入单元格后,Stackview 隐藏在可重用的 tableview 单元格中

    ios - 具有自动布局的 Swift UIView 子类

    ios - 使用 hidesBarsOnSwipe 更新 ProgressView 的约束

    ios - 核心图:如何在平均值上绘制带有 Y 轴的图?

    ios - 不同设备的单个大小类中的iOS不同字体大小

    ios - 获取不可见的 UITableViewCell