在iOS8中,Apple为UITableView引入了一种名为Self-Sizing-Cells的新特性。这是新的SDK中最让我兴奋的一种特性。iOS8以前,如果你想要在tableview中显示可变高度的动态内容,必须单独计算每一个cell的高度。现在到了iOS8,Self-Sizing-Cell 提供了显示动态内容的一种解决方案。简言之,使用自适应cell,你只需要做下面几点:
- 使用autolayout定义cell的约束条件
- 设置tableview的row的估计高度
- 设置tableview的rowHeight属性为UITableViewAutomaticDimension
如果用代码来表示后两点的话,看起来大概是这个样子的:
只需要两行代码,你就可以让tableview根据内容计算cell的尺寸并自动渲染它。使用Self-Sizing-Cell特性能够节约你的时间和代码量,相信你会喜欢它的。
##使用Self-Sizing-cell创建一个简单地示例
学习一个新特性最好的办法就是使用它。让我们用一个demo程序来示范Self-Sizing-cell的使用。 首先又一个模板工程,这是一个显示酒店列表的简单app。每一个cell包括两行文字,分别是酒店的名字和地址。如果你下载并执行该程序的话,效果应该如下:
正如你所看到的,由于每个row的高度都是固定的,一些酒店的地址被截断了。你可能在开发基于tableview的应用时也会遇到同样地问题。在过去,你可能简单地缩小字体或者增加文本行数来修复这个问题。从iOS8以后,你需要做的就是使用Self-Sizing-Cell,这样cell就会根据内容进行合适适配,无论内容的长度如何变化,都能够正常的显示。
##添加AutoLayout的约束
你可能讨厌AutoLayout并且在尽量的避免使用它。但是,不使用AutoLayout,Self-Sizing-Cell就不恩能够够正常的工作,因为它是根据autoLayout的约束来确定正确地rowHeight的。实际上,是tableview在每一个cell上调用了systemLayoutSizeFittingSize来返回基于layout约束计算出的cell尺寸。
请对name和address的两个label自行添加相应约束。
##设置预估的cell高度
添加了AutoLayout的约束之后,剩下的就是在viewDidLoad方法中添加下面的代码:
第一行代码设置预估的cell高度,第二行代码修改tableview的rowHeight属性为UITableViewAutomaticDimension。换句话说,就是你让tableview根据其他信息计算cell的尺寸。
如果你现在测试应用,会发现还是不正确的,因为name和address两个控件都设置了SingleLine的属性。所以设置LineNumber为0,使文本行数能够自动根据内容增长。
到这里,就全部完成,再次运行app,tableview的cell就会根据内容自动计算高度了。