当我推送一个新的视图控制器时,自动布局高度发生变化
Posted
技术标签:
【中文标题】当我推送一个新的视图控制器时,自动布局高度发生变化【英文标题】:Autolayout height changes when I push a new view controller 【发布时间】:2014-08-08 10:26:06 【问题描述】:编辑:我解决了我的问题,但我有兴趣了解我的修复为何有效。见下文。
我使用自动布局来构建我的UITableViewCell
s。
该单元格非常简单,有 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);
到底做了什么,因为它有点模棱两可。但是,可以肯定的是,它添加了您正在寻找的缺失约束。
可能缺少的约束是:
-
紫色视图的高度必须等于绿色视图的高度。
黄色视图的高度必须等于紫色视图的高度。
绿色视图的高度必须等于黄色视图的高度。
希望这可以为您澄清。
【讨论】:
以上是关于当我推送一个新的视图控制器时,自动布局高度发生变化的主要内容,如果未能解决你的问题,请参考以下文章