当我推送一个新的视图控制器时,自动布局高度发生变化

Posted

技术标签:

【中文标题】当我推送一个新的视图控制器时,自动布局高度发生变化【英文标题】:Autolayout height changes when I push a new view controller 【发布时间】:2014-08-08 10:26:06 【问题描述】:

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

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

该单元格非常简单,有 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 会改变其大小!

【问题讨论】:

第二次 push 和 pop 会发生什么? 一旦变大,它就会保持大。 我也遇到了同样的问题,但不幸的是你的修复方法对我不起作用。 我遇到了同样的问题,但您的解决方法没有帮助。 【参考方案1】:

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

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

    紫色视图必须左对齐。 紫色视图必须顶部对齐。 紫色视图的宽度可以变化,但它的最小值和最大值并不重要。 黄色视图必须右对齐。 黄色视图必须顶部对齐。 黄色视图的左边缘必须距离紫色视图的右边缘 5 像素。 绿色视图必须左对齐。 绿色视图必须底部对齐。 绿色视图必须右对齐。 绿色视图的上边缘必须距离紫色视图的下边缘 0px。

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

考虑以下内容:

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

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

可能缺少的约束是:

    紫色视图的高度必须等于绿色视图的高度。 黄色视图的高度必须等于紫色视图的高度。 绿色视图的高度必须等于黄色视图的高度。

希望这可以为您澄清。

【讨论】:

以上是关于当我推送一个新的视图控制器时,自动布局高度发生变化的主要内容,如果未能解决你的问题,请参考以下文章

当兄弟姐妹随自动布局发生变化时,视图不会重绘

UINavigationBar 旋转和自动布局

使用自动布局调整子视图的大小

当我为自定义视图设置动画时,视图的高度会发生变化

UIViews 的高度与屏幕的高度成比例(自动布局)

当项目使用自动布局时,导航控制器无法在 iOS 7 中推送视图控制器