美文网首页
tableView性能优化与手动绘制cell内容

tableView性能优化与手动绘制cell内容

作者: 搬运工开发者 | 来源:发表于2016-12-14 23:39 被阅读171次

    公司开发的项目中有一个类似朋友圈的功能,包括九宫格图片、文字,在项目中对tableView进行了一些优化。

    UITableView的回调顺序是先多次调用tableView:heightForRowAtIndexPath:以确定contentSize及Cell的位置,然后才会调用tableView:cellForRowAtIndexPath:,从而来显示在当前屏幕的Cell。
    比如:如果现在要显示20个Cell,当前屏幕显示5个。那么刷新(reload)UITableView时,UITableView会先调用20遍tableView:heightForRowAtIndexPath:方法,然后调用5遍tableView:cellForRowAtIndexPath:方法;滚动屏幕时,每当Cell滚入屏幕,都会调用一次tableView:heightForRowAtIndexPath:、tableView:cellForRowAtIndexPath:方法。
    

    优化方法:

    1、  缓存行高(缓存高度是最有效的额)
    2、  尽量少计算,所有需要的素材提前计算好
    3、  设置控件的圆角不使用layer属性,使用贝塞尔曲线设置圆角
    4、  不动态创建控件,所有需要的控件都提前创建好,在显示的时候根据数据隐藏或显示
    5、  UITableViewCell的控件越少越好
    6、  UITableViewCell设置异步绘制:self.layer.drawsAsynchronously = YES;UITableViewCell设置栅格化,self.layer.shouldRasterize = YES; self.layer.rasterizationScale = UIScreen.main().scale;(会触发离屏渲染,尽量少用)
    8、  对于UITableViewCell显示图片则在后台根据控件大小剪切生成新的图片,防止图片拉伸消耗性能
    9、  设置UITableViewCell上控件的背景颜色,少用或不用透明图层
    10、UITableView滚动时可禁止网络请求
    11、尽量使所有的view opaque,包括Cell自身
    12、按需加载 - 如果目标行与当前行相差超过指定行数,只在目标滚动范围的前后指定行数加载。
    
    如果以上的方法没办法解决你的问题,你可以选择手动绘制cell的内容,实际上我们往cell添加控件最终也是系统调用绘制方法进行绘制显示内容。
    当UITableViewCell拥有多个子视图时,IOS的渲染机制会拖慢速度。重写drawRect直接绘制内容的方式可以提高性能,而不是在类初始化的时候初始化一些label或者imageview等。
    

    最后sunnyxx
    大神提出了很好的优化方案:http://blog.sunnyxx.com/2015/05/17/cell-height-calculation/ 大伙可以自行研究研究

    相关文章

      网友评论

          本文标题:tableView性能优化与手动绘制cell内容

          本文链接:https://www.haomeiwen.com/subject/ynswmttx.html