UITableview优化方案

1.缓存行高
    tableview在执行reloadData时,首先所有行先刷新一次行高,然后再创建一屏的cell,滚动视图时,新出现的行调用行高方法,刷新当前行。所以,如果把计算行高这种耗时操作放在cell滚动中,会引起卡顿,我们最好事先计算后cell的高度,避免滑动cell时重复计算。

2.不要动态创建子View
    cell中的子view都预先在初始化方法里创建,对于仅个别cell需要显示的view,我们可以对view的 hidden进行处理,而不是执行add、remove操作。这样可以减少,在cell上创建、或从缓存池中取子控件或布局控件的耗时操作。

3.所有的子视图添加到contentView上
    这个是个习惯,可以为cell的侧滑编辑操作做好铺垫。

4.所有的子视图都有指定背景颜色
    如果cell上的控件未指定背景颜色,会影响tableview滑动的流畅度,直接看第5条。

5.所有的子视图尽量不要使用alpha
    减少图层的blend操作,展示透明的view,设备会把当前view与背景图进行alpha叠加,如果动画中每一帧都需要这么操作,性能的消耗很严重。
    对于滑动的视图,我们尽量不要使用clearColor,使用与superView相同的色值来达到相同效果。
    图片控件避免使用透明的图片,即使使用了透明的图片,我们最好将透明图片与背景色合成不透明图片,也要避免做重复合成操作。
    UIImageView使用时避免透明:图片非透明;opaque的值(默认YES);view的alpha值;view的背景色。
    当opaque为YES时,那么view的alpha设置将不起作用,那图层透不透明只取决于图片和背景色,如果叠加结果是不透明,那么图层不透明,将不会触发blend操作;如果叠加结果是透明的,那么会触发blend操作。
     我们好控制的图层的背景色尽量避免使用alpha操作。

6.cell栅格化
    栅格化是指将矢量图转换成位图的过程。
    针对于内容比较固定的cell,建议采用栅格化,让Core animation帮我们完成图层的混合,生成一个静态图,优化帧率。

7.异步绘制
    尽量不要在cell中使用圆角操作,如果使用可以让美工切圆角图,即使非要绘制也需要异步绘制。

以下是我们工程中的一个界面处理:

UITableview优化方案_第1张图片
实例截图

针对字体商城提出两点优化点:

1.透明层效果

2.圆角

针对优化点给出方案:

1.图片的透明层效果,此处没给合适的切图,当然给完整的透明图最好,此处我们在不影响性能的情况下实现该效果,将透明图与图片合并,避免出现blend操作。

2.圆角效果采用异步绘制方式
    当真正在工程中操作时,我们把透明层做了先做了圆角处理,然后与原图叠加再进行截图,这样操作步骤2可以避免,其实步骤2的代码也已给出,以下是操作代码:

cell中圆角处理代码:

- (void)generateAlphaBgImage{
    alphaBgImageArray = [[NSMutableArray alloc]init];
    for (int i = 0; i < 10; i++) {
        NSString *imageStr = [NSString stringWithFormat:@"fontStoreBackground%d", i];
        UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(15.0f, 5.0f, WIDTH_OF_SCREEN - 30.0f, rowHeight - 10.0f)];
        imageView.image = [UIImage imageNamed:imageStr];
        
        UIView *alphaView = [[UIView alloc]initWithFrame:imageView.bounds];
        alphaView.backgroundColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.3f];
        alphaView.layer.masksToBounds = YES;
        alphaView.layer.cornerRadius = 8.0f;
        [imageView addSubview:alphaView];
        
        UIImage *image = [CommUtls changeViewToImage:imageView compress:[UIScreen mainScreen].scale];
        [alphaBgImageArray addObject:image];
    }
}
+ (UIImage *)changeViewToImage:(UIView *)currentView compress:(CGFloat)compress
{
    UIGraphicsBeginImageContextWithOptions(currentView.bounds.size, NO, compress);
    [currentView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    if (compress < 1)
    {
        viewImage = [self imageWithImage:viewImage scaledToSize:CGSizeMake(viewImage.size.width * compress, viewImage.size.height * compress)];
    }
    return viewImage;
}
+(UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize
{
    // Create a graphics image context
    UIGraphicsBeginImageContext(newSize);
    
    // Tell the old image to draw in this new context, with the desired
    // new size
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
    
    // Get the new image from the context
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    
    // End the context
    UIGraphicsEndImageContext();
    
    // Return the new image.
    return newImage;
}

你可能感兴趣的:(UITableview优化方案)