我有一个 UITableViewCell 子类,其中包含多行标签,我希望单元格根据该标签的内容动态调整自身大小。我知道 iOS 8 引入了基于自动布局约束的自动调整单元格大小,并且我已经在 SO 上找到了几个这样的示例,但我在正确实现此行为时仍然遇到一些问题。
这是我的 updateConstraints 实现:
- (void)updateConstraints {
[super updateConstraints];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[_nameLabel(==20)]-10-[_tweetLabel]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_nameLabel, _tweetLabel)]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[_avatarView]-10-[_nameLabel]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_avatarView, _nameLabel)]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_nameLabel]-10-[_tweetLabel]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_nameLabel, _tweetLabel)]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[_avatarView]-10-[_tweetLabel]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_avatarView, _tweetLabel)]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[_avatarView(==45)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_avatarView)]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[_avatarView(==45)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_avatarView)]];
}
在表视图控制器中,我将行高设置为 UITableViewAutomaticDimension (并且我还设置了估计行高)。在运行时,我遇到一系列自动布局错误,并且所有表格视图单元格几乎完全重叠。
自动布局冲突存在于以下约束之间:
V:|-(10)-[_nameLabel]
V:[_nameLabel(20)]
V:[_nameLabel]-(10)-[_tweetLabel]
V:[_tweetLabel]-(10)-|
V:[cell(44)]
我怀疑最后一个约束“UIView-Encapsulated-Layout-Height”(强制高度为 44)是问题的原因,但我不太确定它来自哪里,所以希望有人可以解释一下问题。
为了实现表视图单元格的自动行高,您需要执行以下操作:
-
在单元格的 contentView 中实现自动布局约束,允许视图表达其首选高度。一定要设置UILabel
s 进行多行自动换行。
确保您已在两个维度中定义了一系列约束的轴向链,即从视图的一个边缘到另一边缘共同绑定的约束。也许确保这些约束正确的最简单方法是将您的自定义内容实现为普通的旧内容UIView
(这很容易测试),然后使用约束,以便UITableViewCell.contentView
拥抱这种观点。 (我用这个要点自动构建“视图包装单元”。)
-
Set tableView.rowHeight = UITableViewAutomaticDimension
-
Set tableView.estimatedRowHeight = 400
或其他一些相当慷慨的值,以便在估计值太低时解决一些 UIKit 错误。
我花了相当多的时间来研究这个功能。这个 github 仓库 shows 自调整大小表格视图单元格的七个完整示例包含一个包装文本的标签——程序化、基于笔尖、基于故事板等。
最后,如果您在第一次加载表视图时看到有关不可满足约束的警告,其中提到“UIView-Encapsulated-Layout-Height”或类似内容,请不要太担心。这是一个人工制品UITableView
创建单元格的初始过程,确定其大小should基于自动布局约束,并保持UITableViewCell
紧紧包裹着它的contentView
。我上面提到的存储库有更广泛的讨论和代码,用于探索 API 的这个有点尴尬的角落。
您只需担心违反约束的警告,即使在单元格加载并滚动了一点之后它们仍然存在,或者您最初看到不正确的布局。在这种情况下,第一步应该始终是通过开发约束并在可能的情况下单独测试它们来确保您的约束是正确的,以简单的方式UIView
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)