UITableView的优化

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函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值