
在本文中,我将尝试揭示UITableView类的一些怪癖,并向您展示实现高度可变的页眉和页脚的最简单方法。 对我来说,简单在于编写用户界面代码,但实际上并不是对任何UI进行编码。 在本文中,我将充分利用界面生成器:)
我将谈论页眉,但是页脚同样适用。

TableView设定
表格标题或简单的TableView样式的标题与其他任何UITableView行没有区别。 设置实际上非常简单。
- 必须设置
sectionHeaderHeight
和estimatedHeaderHeight
。 UITableView.automaticDimension
是允许AutoLayout在运行时计算每个单元格高度的工具。- 必须设置estimateHeaderHeight才能大致估计其内容的整体高度,以便显示滚动指示器。
在情节提要中选择TableView时,可以在“大小”检查器中设置这些属性。

创建标题视图
tableView(_: viewForHeaderInSection: )
应该返回一个UIView实例,但是您猜怎么着? UITableViewCell是UIView的子类。 这意味着我们可以使用情节提要创建一个可以从此函数中删除并返回的原型单元。 我认为,这是在一个地方声明所有视图的最佳方法,而不是在项目中散布许多xib文件的最佳方法。

我创建了一个单元原型,该单元原型由左侧的ImageView,标题和描述标签组成。 在此项目中,未设置静态高度。 我们希望布局根据标签内容的大小自动计算单元的高度,这将在运行时确定。
标签放置在StackView中,并且限于单元格内容视图的所有四个侧面。 我更喜欢在创建视图时使用StackView来减少限制数量。

要返回视图,我们调用
dequeueReusableCell(withIdentifier identifier: String) -> UITableViewCell?
。 我们没有使用
forIndexPath:
函数的变体,因为我们没有为标题行定义indexIndex。 此外,
forIndexPath:
指出为从队列中排除的单元格定义了重用标识符,以防止nil返回。 在我们的情况下,该部分可能没有标题显示。
guard let headerCell = tableView.dequeueReusableCell(withIdentifier: "header") else { return nil }
空白部分标题
按照计划,如果未定义组样式的表格视图中节的标题,则框架将显示一个大小为30像素的空视图。 苹果公司决定,如果不同的部分看起来像一个部分,那将很奇怪。 但是有时候我们只是想违反规则。 :)
为了解决这个问题,您可以使用常量
CGFLOAT_MIN
。 它代表CGFloat的最小非负值。 对于32位和64位代码,值分别为1.17549435e-38F或2.22507385850720142014-308。 最后,它不是零像素。 另一方面,在简单的表格视图中,标题的高度可以设置为大于或等于0的任何值。
对于这种特殊情况,我们需要使用
tableView(_:estimatedHeightForHeaderInSection:)
tableView(_:heightForHeaderInSection:)
tableView(_:estimatedHeightForHeaderInSection:)
和
tableView(_:heightForHeaderInSection:)
。 如文档中所述,必须实现两个功能以确定自定义视图的高度。
结论
我不知道看到想要实现不同高度的标头的人对StackOverflow有如此多的攻击。 这是我在使用TableView时经常使用的简单技巧,希望它对您和我一样有用。 好的编码! :)