UITableView的优化主要是图片和cell动态高度。
核心思想:线程加载图片和计算高度后再加载。
解决问题:UITableView滑动卡顿。
问题一 图片显示圆角:
方法一:[view.layer setCornerRadius:5],这是最糟糕的方法,大量使用,app会卡得怀疑人生。
方法二:使用贝塞尔画圆角图片再显示
CGFloat scale = [[UIScreen mainScreen] scale] >= 2 ? 2 : [[UIScreen mainScreen] scale];
CGFloat widht = width * scale;
CGRect aRect = CGRectMake(0., 0., widht, widht);
CGPathRef clippingPath = [UIBezierPath bezierPathWithRoundedRect:aRect cornerRadius:widht / 2].CGPath;
UIGraphicsBeginImageContext(aRect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextAddPath(context, clippingPath);
CGContextClip(context);
[image drawInRect:aRect];
UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return croppedImage;
方法三:服务器生成圆角图片。
方法四:找UI切一张圆形的透明图,边框和背景色一致。不过此方法限制比较多,当app不断迭代,有时候UI设计会因为这种开发方式受限。
*个人现在一直使用第二种,另外还有一种是使用mask进行渲染,感觉和第二种方法有些重叠了,而且还把mask层占用,有兴趣的可自行去查阅相关资料。
问题二 图片显示时机
图片的显示是会需要占用主线程进行绘图,因此在滑动过程中,大量绘图会造成卡顿情况。
方法一:在停止手部滑动动作时,开始加载图片
-
(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
if (decelerate == NO)
[self checkCellLoadImageNecessary];
} -
(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
[self checkCellLoadImageNecessary];
}
另外在网上看到csdn很多人转载“预加载图片”的技术,个人感觉效果不大而且不是正规操作,不懂为啥那么多人去转载,有兴趣的程序员可自行去研究。
另外简单介绍两个加载本地图片的函数(网络图片可以先下载后,再本地加载)。
imageName:会产生缓存,下次加载该图片会加快,适合反复加载的图片。
imageWithContentsOfFile: 不会产生缓存,适合加载只加载一次的图片。
问题三 cell动态高度
cell显示文本时,常需计算cell高度,可在model添加cellHeight字段,cell添加函数+heightForCell,获取数据后,多线程计算cell高度后再刷新uitableview。
*小技巧:获取下一页,可在滑动到剩下5个就开始加载下一页,避免用户每次滑到底部还需要等待加载请求下一页。
*如果发现滑动,下面的cell显示了旧cell的信息,请重写prepareForReuse函数。