UITableView是在应用界面里非常常用的一个控件了,打开一个应用,内容列表作者列表朋友圈列表等等,,,都离不开UITableView。
而UITableView的精髓,则是在UITableViewCell展现的,最常用的自定义细胞有的行高是固定的,而大部分则需要根据内容来计算行高展示的。
下面就说说我在实际开发中处理单元行高的几种情况:
我在写表视图时,基本都是自定义细胞,而所有的自定义细胞,都会继承一个基类BaseTableViewCell:
。h里:
. h里://重用标识 + (NSString *) reuseIdentifier;//细胞高度 + (CGFloat) staticHeight; 00里: - (id) initWithStyle:(UITableViewCellStyle)风格reuseIdentifier: (NSString *) reuseIdentifier { 自我=[超级initWithStyle:风格reuseIdentifier reuseIdentifier):; 如果(自我){ 自我。不透明=没有; 自我。selectionStyle=UITableViewCellSelectionStyleNone; } 回归自我; }//重用标识 + (NSString *) reuseIdentifier { 返回NSStringFromClass((自我类)); }//细胞高度 + (CGFloat) staticHeight { 返回44. f; }
这样写的好处是,当我们在使用视图时,会方便我们对重用标识符行高使用,看一下:
staticHeight可以在子类的自定义细胞里更改设置,使用时:
这样写,更能清晰明了的看到对每个自定义细胞的设置,也会让代码看上去优雅整齐一些。
实际开发中,使用最多的应该是动态计算细胞高度了,这也是tableView很基本的一个功能。
比如搜索资讯这块:
标题高度不固定,内容高度不固定,标签不固定,这样的就需要根据模型里的内容计算行高了:
用的时候,在视图的代理里设置:
——(CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath { WMSearchResultQAModel *模型=self.dataArray (indexpath。row); 返回(WMSearchResultQAModel calutWholeCellHeightWithModel:模型); }
这样就可以达到每个细胞根据内容展示不同高度的要求了。
这种方法很繁琐,但是也是最精确的,最可控的,都支持自动布局和框架。
为什么要缓存高度?
因为当tableView滚动时会不停的回调heightForRowAtIndexPath这个代理方法,当细胞的高度需自适应内容时,就意味着每次回调这个方法时都要计算高度,而计算是要花时间了,在用户体验上的体现就是卡顿,众所周知60 fps是比较符合人眼审视的,如果帧数低于这个数值过的多,就会明显感受到卡帧等现象,为了让用户体验比较好些,我们就要对高度计算进行优化。
引用><>强思路:强>为了避免重复且无意义的计算细胞高度,缓存高度就显得尤为重要了。
<强>缓存高度机制强>
缓存高度我们需要一个容器来保存高度数值,可以是模型可以是一个可变数组也可以是一个可变字典,以达到每当回调heightForRowAtIndexPath这个方法时,我们先去这个缓存里去取,如果有,就直接拿出来,如果没有,就计算高度,并且缓存起来。
以模型为例:
在模型里声明个cellHeight属性,用于保存模型所对应的细胞的高度,然后在heightForRowAtIndexPath方法中,如果当前模型的cellHeight为0,说明这个细胞没有缓存过高度,则计算细胞的高度,并把这个高度记录在模型中,这样下次再获取这个细胞的高度,就可以直接去模型中获取,而不用重新计算:
——(CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath { WMSearchResultQAModel *模型=self.dataArray (indexpath。row); 如果模型。cellHeight祝辞0){//有缓存的高度,取出缓存高度 返回model.cellHeight; }//没有缓存时,计算高度并缓存起来 CGFloat cellHeight;=[WMSearchResultQAModel calutWholeCellHeightWithModel:模型);//缓存给模型 模型。cellHeight=cellHeight; 返回cellHeight; }你应该知道的tableViewCell行高计算处理