如何让tableView保持顺畅

UITalbeView作为一个项目中常用的开发组件之一,如何让其保持流畅的滑动则是最重要的一个环节。

UITableView的核心思想为cell的重用机制。简单的理解就是将滑出屏幕外的cell放进重用池,当要显示某一位置的cell时,先去检查重用池中是否有可重用的cell,如果有,就直接拿来显示;如果没有,才会创建。这样做的好处可想而知,极大的减少了内存的开销。

然而重用cell只是优化UITableView的基础。

病因

App 主线程开始在 CPU 中计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去,由 GPU 进行变换、渲染等一系列的处理。随后 GPU 会把渲染结果提交到帧缓冲区去,等待显示到屏幕上。由于垂直同步的机制,如果一定的时间内,CPU 或者 GPU 没有完成内容提交,则那一帧就会被丢弃,等待下一次机会再显示,而这时显示屏会保留之前的内容不变。这就是界面卡顿的原因。

占用资源主要原因及解决方案

1、控件的创建

在tableView中肯定有大量的内容需要进行展示,所以在cell中肯定需要创建大量的UIView、UILabel之类的控件,在创建时就需要分配内存、调整属性,这些操作都是比较消耗CPU资源的。

在cellForRowAtIndexPath中不要出现创建对象的代码,尽量在cell初始化的时候创建好所有的控件。尽量使用更为轻量的CALayer来代替UIView。

2、视图布局的计算

视图布局的计算是吃CPU资源的主要原因之一,因为计算,所以这方面的资源占用率就不可避免了。

虽然是不可避免的,但也需要将占用资源比例降低。

不论通过何种技术对视图进行布局,其最终都会落到对 frame等属性的调整上。对这些属性的调整非常消耗资源,所以尽量提前计算好布局,在需要时一次性调整好对应属性,而不要频繁的计算和调整这些属性。

3、文本的计算

上面说了只要有计算,对资源的占用就不可避免,所以将文本宽高的计算放入子线程操作,会给主线程减少相当一部分的空间。

4、图像的绘制与图形的生成

drawRect对资源的占用大家应该都有所了解,因CoreGraphic 方法通常都是线程安全的,所以图像的绘制可以很容易的放到后台线程进行。

在项目中经常会把头像之类的控件设置成圆角,如果我们操作CALayer的属性通常都会触发离屏渲染,而当一个界面中出现大量的圆角图像时,滑动帧率就会降得很低。所以尽量避免使用CALayer来生成圆角属性。设置圆角可以参考:iOS 高效添加圆角效果实战讲解

优化技巧

预排版

从后台的回调中拿到数据时,通过后台线程将所有控件的高度与cell的整体高度都给计算出来,然后将这些计算出来的高度都给缓存起来。

高度返回

若高度一定,直接使用rowHeight属性而不是使用heightForRowAtIndexPath方法,以减少调用的消耗。

图片设置

在设置显示图片时,不要直接设置UIImageView的contentMode属性自动适应,图片变形会计算transform,压缩时会乘以一个矩阵,消耗性能。对于要求性能较高的app,应该将得到的图片经过处理成UIImageView大小后再呈现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值