关于UITableView流畅滑动几个注意点

文章来源于:Perfect smooth scrolling in UITableViews 南峰子的技术博客

手动布局和高度优化

  • cell/header/footer的重用
    之前只知道重用cell,没注意到section的header/footer也可以重用,在这里就不举例cell的重用了。
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    static NSString *headerIdentify = @"Hearder";
    UIView *headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:headerIdentify];
    return headerView;
}
  • 数据绑定
    我之前一般在方法 tableView:cellForRowAtIndexPath:
    当中去绑定数据,然而此时屏幕上还没有cell,我们可以把绑定cell数据放在另一个方法中 tableView:willDisplayCell:forRowAtIndexPath:
    这个方法会在显示cell之前调用。
    具体使用哪个方法,网上颇有争议,具体来说执行效率是一样的,只是视觉效果不一样,放在前者的话出现cell的时候已经设置好了数据,而且也会比后者稍微慢一点出来,后者的话数据则在稍后填充进去。

  • 高度计算
    建议使用方法 tableView:heightForRowAtIndexPath:
    去计算cell的高度,但是要先输入数据去计算高度,再进行绑定数据。

    不建议使用这个便捷的方法去计算cell的行高,这里会使用复杂的数学计算去获取cell的高度,
    会影响滚动的流畅性,子视图越多越明显
    self.tableView.rowHeight = UITableViewAutomaticDimension;

绘制数据

  • 渲染最慢的操作之一是混合(blending)
    在iOS模拟器上运行App,在模拟器的菜单中选择’Debug‘,然后选中’Color Blended Layers‘。然后iOS模拟器就会将全部区域显示为两种颜色:绿色和红色。绿色是无混合,红色是混合。
    如果你在一个UITableView 下面垫了一层背景图,这时候整个UITableView都会显示成红色,系统会将上层view和下层view混合之后才能计算出像素点实际颜色,如果混合过多,流畅的滑动是不可能的。
    有背景图:


    566C44F8-5D34-408C-A19F-CEC6CECD319B.png

    无背景图:

3F959E48-E266-41C0-87D7-3C0F9CAB7ACC.png
  • 关键点是在平衡CPU和GPU的负载。
    1.减少iOS执行无用混合的区域:不要使用透明背景,使用iOS模拟器 或者Instruments来确认这一点;如果可以,尽量使用没有混合的渐变。
    2.优化代码,以平衡CPU和GPU的负载。你需要清楚地知道哪部分渲染需要使用GPU,哪部分可以使用CPU,以此保持平衡。
    UIView的drawRect:方法中使用CoreGraphics操作来执行CPU渲染,从而减少对GPU的负载
    3.为特殊的cell类型编写特殊的代码。

像素获取

  • 在iOS模拟器上运行程序,在”Debug“菜单中选中”Color Misaligned Image“。
    紫色区域会执行子像素渲染,在真机上可能或出现模糊;而黄色区域是图片大小没有对齐的情况,可能会有变形的感觉。
    效果图:
A69A6078-93C0-481F-B739-FA3477135812.png

紫色区域的字体,我对它进行固定高度和宽度的约束,所以会出现紫色,需要对像素相关数据进行四舍五入处理。
优化建议:

  • 对所有像素相关的数据做四舍五入处理,包括点坐标,UIView的高度和宽度。
    跟踪你的图像资源:图片必须是像素完美的,否则在Retina屏幕上渲染时,它会做不必要的抗锯齿处理。
    定期复查你的代码,因为这种情况可以会经常出现。

异步UI

  • 这个不用多说了,异步处理复杂cell的需求,再显示到cell上面。

你可能感兴趣的:(关于UITableView流畅滑动几个注意点)