UITableView使用AutoLayout自动调整页眉和页脚视图的大小

在本文中,我将尝试揭露UITableView类的一些怪癖,并向您展示实现可变高度的页眉和页脚视图的最简单方法。 对我来说,编写UI的简单性实际上根本就是不编写任何UI。 在本文中,我将尽可能多地使用界面生成器🙂

我将仅出于简单起见谈论页眉,但页脚也完全一样。

TableView设定

分组样式表或纯样式TableView的标题与UITableView的任何其他行都没有不同。 设置实际上非常简单。

  • 需要设置sectionHeaderHeightestimatedHeaderHeight
  • UITableView.automaticDimension是使AutoLayout能够在运行时计算每个单元格的高度的工具。
  • 应该将EstimatedHeaderHeight设置为对其内容的总高度的粗略估计,以显示滚动指示器。

在情节提要中选择TableView时,可以在“大小”检查器中设置这些属性。

创建标题视图

tableView(_:viewForHeaderInSection:)应该返回UIView的实例,但是您猜怎么着? UITableViewCell是UIView的子类。 这意味着我们可以使用情节提要板创建一个原型单元,该单元将从该函数中出队并返回。 我认为,这是在一个位置声明所有视图的最干净的方法,而不是将许多xibs散布在整个项目或在代码中声明为原型的单元或其他单元中。

我创建了一个原型单元,该单元由左侧的ImageView,标题和字幕标签组成。 在此项目的任何地方都没有设置静态高度。 我们希望自动布局根据标签的固有内容大小(将在运行时由其内容定义)来计算单元格的高度。

标签包装在StackView中,并限制在单元格内容视图的所有四个侧面。 我更喜欢在创建视图时使用StackView来减少定义的约束数量。

为了返回视图,我们调用dequeueReusableCell(withIdentifier identifier: String) -> UITableViewCell? 。 我们不使用此函数的forIndexPath:风格,因为我们没有为标头行定义indexPath。 同样, forIndexPath:断言为出队的单元格定义了一个重用标识符,以防止返回nil。 在我们的情况下,可以显示没有标题的部分。

 警卫让headerCell = tableView.dequeueReusableCell(withIdentifier:“ header”)else { 
返回零
}

空白部分标题

通过设计,如果在组样式表视图中没有为节定义标题,则框架将呈现30像素的空白视图。 苹果公司认为将不同的部分作为一个部分出现看起来很奇怪。 有时,我们只是想违反规则。 ♀️

要解决此问题,可以使用CGFLOAT_MIN常量。 它代表CGFloat的最小非负值。 对于32位和64位代码,值分别为1.17549435e-38F或2.2250738585072014e-308。 毕竟,它不是零像素。 另一方面,在纯样式表视图中,标题高度可以设置为大于或等于0的任何值。

对于这种特殊情况,我们需要使用tableView(_:estimatedHeightForHeaderInSection:)tableView(_:heightForHeaderInSection:) 。 如文档中所述,必须实现这两个功能以定义自定义视图的高度。

结论

我很困惑地看到想要实现高度变化的标头的人对StackOverflow有如此多的攻击。 这是我在使用TableView时一直使用的简单技巧,希望它对您和我一样有用。 编码愉快! 🙂

Poka estàla la recherche d’un dev iOS poquejoindédééééédeQuébec,si tudésirestravailler avec moi,envoie ton CVàjobs@poka.io🥳