你应该知道的tableViewCell行高计算处理

  

  

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;   }      

这样写的好处是,当我们在使用视图时,会方便我们对重用标识符行高使用,看一下:

  

澳阌Ω弥赖膖ableViewCell行高计算处理"

  

staticHeight可以在子类的自定义细胞里更改设置,使用时:

  

澳阌Ω弥赖膖ableViewCell行高计算处理"

  

这样写,更能清晰明了的看到对每个自定义细胞的设置,也会让代码看上去优雅整齐一些。
  

  


  

  

实际开发中,使用最多的应该是动态计算细胞高度了,这也是tableView很基本的一个功能。
  

  

比如搜索资讯这块:

  

澳阌Ω弥赖膖ableViewCell行高计算处理"

  

标题高度不固定,内容高度不固定,标签不固定,这样的就需要根据模型里的内容计算行高了:

  

澳阌Ω弥赖膖ableViewCell行高计算处理"

  

用的时候,在视图的代理里设置:
  

        ——(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行高计算处理