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中使用圆角操作,如果使用可以让美工切圆角图,即使非要绘制也需要异步绘制。
以下是我们工程中的一个界面处理:
针对字体商城提出两点优化点:
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;
}