UITableViewHeaderFooterView 不支持笔尖中的自动布局约束

Posted

技术标签:

【中文标题】UITableViewHeaderFooterView 不支持笔尖中的自动布局约束【英文标题】:autolayout constraints in nib not honored for UITableViewHeaderFooterView 【发布时间】:2015-06-25 08:08:19 【问题描述】:

我有一个UITableView,其中包含几列数据。可重用单元从具有适当标签和自动布局约束的 xib 文件加载。一切正常;表格列在不同设备上以及设备旋转时的布局正确。

我遇到的问题是尝试创建一个表格页脚来显示表格中各列的总数。

我创建了一个与单元格 xib 文件具有相同自动布局约束的 xib 文件,并以与单元格相同的方式将其加载到 tableView.viewForFooterInSection 中。根据需要,我使用UITableViewHeaderFooterView 的子类而不是UITableViewCell

UITableViewHeaderFooterView 子类中的 awakeFromNib 方法设置背景颜色,因此我可以看到它在所有设备/方向上都是正确的大小,但页脚 xib 文件中的标签没有被布置以匹配表格单元格。

页脚 xib 文件中的自动布局约束未得到遵守。当我在页脚 xib 文件中设置不同的背景颜色时,表格页脚会在 xib 视图的长度范围内显示此背景颜色。

我是所有这些技术的新手,非常感谢帮助解决这个令人难以置信的令人沮丧的问题。

有没有办法为从笔尖加载的UITableViewHeaderFooterViews 使用自动布局?

【问题讨论】:

dequeueReusableHeaderFooterViewWithIdentifier 返回的单元格的 contentView 为 nil,但在 nib 中定义的标签显示在页脚中。标签的父视图是一个 UITableViewCellContentView,它的父视图是 UITableViewHeaderFooterView 的子类(单元格的类)。我可以通过 cell.subviews[1].subviews[0] 访问 lldb 中的标签,当我在子视图上尝试 constraintsAffectingLayoutForAxis(UILayoutConstraintAxis.Vertical) 时,没有约束 - 从笔尖加载视图时它们必须被剥离. 【参考方案1】:

您应该致电setNeedsUpdateConstraints() 更新您的视图。

来自苹果文档

控制视图的约束是否需要更新。 当您的自定义视图的属性以影响约束的方式发生变化时,您可以调用此方法来指示 约束需要在未来的某个时候更新。系统 然后将调用 updateConstraints 作为其正常布局传递的一部分。 在需要约束之前一次性更新所有约束确保 当多个约束时,您无需重新计算约束 在布局传递之间对您的视图进行更改。

另外,你可以更新视图抛出layoutSubviews()

布置子视图。此方法的默认实现是 在 ios 5.1 及更早版本上什么都没有。否则,默认实现 使用您设置的任何约束来确定大小和位置 的任何子视图。子类可以根据需要重写此方法 对其子视图执行更精确的布局。你应该覆盖 此方法仅适用于自动调整大小和基于约束的行为 子视图不提供您想要的行为。您可以使用您的 实现直接设置子视图的框架矩形。 您不应直接调用此方法。如果你想强制一个 布局更新,调用 setNeedsLayout 方法而不是事先这样做 到下一次图纸更新。如果你想更新你的布局 立即查看,调用 layoutIfNeeded 方法。

【讨论】:

setNeedsUpdateConstraints 和 layoutIfNeeded 似乎没有任何效果。奇怪的一件事是 cell.contentView 为 nil,但我看到 xib 中定义的标签,只是布局不正确。

以上是关于UITableViewHeaderFooterView 不支持笔尖中的自动布局约束的主要内容,如果未能解决你的问题,请参考以下文章