仅在Swift中使用约束来扩展UITableView单元格

这是一个常见的要求,您在创建iOS应用时可能会偶然发现。

首先,我们要实现的结果。

让我们跳入Xcode并创建一个新的“ Single View Application”项目。 我们将从设计界面开始。
一个以ViewController为根的简单UINavigationController即可

让我们添加我们的UITableView并向其中添加一个UITableViewCell 。 我们需要两个标签,一个是标题,另一个在下面,是显示或隐藏的字幕。

因为我们要让AutoLayout自动计算像元高度,所以我们需要相应地设置约束。
在两个标签上添加前导和尾随约束。 然后,我们要在标题及其超级视图之间添加顶部约束,在字幕及其超级视图之间添加底部约束,并在两个标签之间添加垂直间距约束。
这将使AutoLayout能够了解我们希望基于标签的固有高度来增加超级视图。 我们还将两个标签的numberOfLines属性都设置为零,因此它们不会被截断。

那时,AutoLayout可能会显示错误,要求您为其中一个标签设置不同的垂直拥抱优先级。 似乎是逻辑,因为目前两者都具有相同的优先级,并且AutoLayout需要知道哪个优先。 我们可以降低垂直的拥抱优先级,也可以为两个标签设置一个固定的高度限制,以消除此错误。

目前,我们的UI似乎不错,让我们深入研究代码! 首先,我们需要为原型UITableViewCell创建一个新类。 为了独具匠心,我们可以将其称为ExpandingTableViewCell
添加两个标签出口,并将它们链接到InterfaceBuilder中的实际视图。

现在,为我们的单元提供支持类是一个好主意。 您可以使用简单的字典,但是具有类型化的属性始终是一个加号。 为了准确表示我们的单元格状态,我们需要一个标题,副标题和一个布尔值以检查单元格是否扩展。

现在已经解决了,放到我们的ViewController上

我们想要一个链接到UITableView的属性,另一个是将包含单元格表示形式的数组的属性。 让我们用一些ExpandingTableViewCellContent实例填充它,以便稍后显示。

我们仍然必须实现UITableView的数据源,更重要的是实现魔术的委托!
在我们的委托方法didSelectRowAtIndexPath中 ,我们需要两件事:
–在特定索引处更改支持类的扩展状态
–重新加载单元以反映其新状态

好了,一切似乎都准备就绪,让我们构建并运行(命令+ R)!

哎呀,那不是我们想要的! 好吧,我们错过了ViewController viewDidLoad中的最后一个细节,以使其成为本垒打。 我们需要向UITableView明确指定AutoLayout应注意我们的单元格高度。 分两行完成:

tableView.estimatedRowHeight = 60
tableView.rowHeight = UITableViewAutomaticDimension

这次,代码应该可以平稳运行并正常运行。 请享用!

希望您喜欢本教程,可以在github上找到其源代码。 如果发现有用,请随时喜欢/评论!