在iOS8之后苹果推出的一个新特性Self Sizing Cells,意思就是让cell自己计算自己的高度,当我们在cell里面添加完所需控件,并约束好位置之后,我们只需要设置
tableView.estimatedRowHeight = 44.0f;//推测高度,必须有,可以随便写多少
tableView.rowHeight =UITableViewAutomaticDimension;//iOS8之后默认就是这个值,可以省略
这两句代码之后,即可放心的往cell的控件里面加上内容,cell会根据内部所有控件的高度动态的计算自己的高度从而显示出来。这个就有点类似于html5中的body,会根据自己内部的内容调整自己的大小。这就给iOS开发者提供了很大的便利,不再需要之前复杂的自适应计算方法。但是要注意的是,这个需要在iOS8之后才可以使用,如果你的应用要适配iOS8之前的版本,可能无法使用该机制,当然也可以对系统版本进行判断之后再决定使用哪一套适配方案。
介绍cell子控件如何autolayout
我查了一些资料是这样说的模板单元格中,subviews的自动局部必须要能够把单元格撑满。也就是说,iOS 必须能够通过内容的自动布局约束计算出 cell 的高。但是以我的理解,必须保证cell中子控件在一条Y轴上有自上而下所有的约束,我这么说可能不太理解,我来个迷之画图吧
WechatIMG2.jpeg
如图,我们要对这个cell的高度做自适应,很明显,可变动的就是label1或者label2这个控件,OK,那我刚才所说的Y轴方向的约束指的是什么呢? 我们从上向下看,就是子控件的Y值和子控件的高度还有最下面一个子控件的底部到cell底部的距离,这些条件满足,我们才能让cell的高度"有据可循",当然一些控件的其他约束也要添加完好..
好,我们来假设一个场景吧,李菊福一波,还是上图的cell,imageview是头像,label1是昵称,label2是评价的内容,可能很长需要换行等等,所以这就要求我们的cell需要在特定是的数据面前"各不相同"..
一般来说,imageView给这些约束就差不多(不在主要讨论范围)
WechatIMG3.jpeg
我们给label1也来个约束
WechatIMG4.jpeg
相对与imageView的top
WechatIMG5.jpeg
来个equalTop
那我们来看看label2(这是我的约束习惯勿喷),你宽度写死也是ok的
WechatIMG6.jpeg
因为label2的高度不固定,所以numberOfLines = 0不多说,我们还要对他高度的约束做一个小小的设置如下图,让laebl2的高度大于等于原来的高度
WechatIMG7.jpeg
这样我们就拥有了Y轴所有的约束,我们下面我们来盘点下
cell高度 = imageViewY值(label1Y值) + label1高度 + label2top距离label1bottom间距
+ label2高度(不确定,数据很多会变化,大于等于原设置的高度) + label2bottom距离bellbottom的间距
我们这样一番折腾后,cell子控件的Y轴方向的所有约束全部搞定了,然后我们按照自己的套路去给cell的子控件赋值数据什么的就可以了,别忘了给tableView设置文章一开头设置的那两句话,这样我们的cell就做到了自适应的高度,我文章中举的例子非常简单,我相信大家再公司的项目中cell要复杂的多,只要遵循Y轴方向的约束全部满足就可以了