1.緩存行高
????tableview在執(zhí)行reloadData時磅网,首先所有行先刷新一次行高,然后再創(chuàng)建一屏的cell竹捉,滾動視圖時芜辕,新出現(xiàn)的行調(diào)用行高方法,刷新當前行块差。所以侵续,如果把計算行高這種耗時操作放在cell滾動中倔丈,會引起卡頓,我們最好事先計算后cell的高度状蜗,避免滑動cell時重復計算需五。
2.不要動態(tài)創(chuàng)建子View
????cell中的子view都預先在初始化方法里創(chuàng)建,對于僅個別cell需要顯示的view轧坎,我們可以對view的 hidden進行處理宏邮,而不是執(zhí)行add、remove操作眶根。這樣可以減少蜀铲,在cell上創(chuàng)建、或從緩存池中取子控件或布局控件的耗時操作属百。
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設置將不起作用,那圖層透不透明只取決于圖片和背景色棚菊,如果疊加結果是不透明浸踩,那么圖層不透明,將不會觸發(fā)blend操作窍株;如果疊加結果是透明的民轴,那么會觸發(fā)blend操作攻柠。
???? 我們好控制的圖層的背景色盡量避免使用alpha操作。
6.cell柵格化
????柵格化是指將矢量圖轉換成位圖的過程后裸。
????針對于內(nèi)容比較固定的cell瑰钮,建議采用柵格化,讓Core animation幫我們完成圖層的混合微驶,生成一個靜態(tài)圖浪谴,優(yōu)化幀率。
7.異步繪制
????盡量不要在cell中使用圓角操作因苹,如果使用可以讓美工切圓角圖苟耻,即使非要繪制也需要異步繪制。
以下是我們工程中的一個界面處理:
針對字體商城提出兩點優(yōu)化點:
1.透明層效果
2.圓角
針對優(yōu)化點給出方案:
1.圖片的透明層效果扶檐,此處沒給合適的切圖凶杖,當然給完整的透明圖最好,此處我們在不影響性能的情況下實現(xiàn)該效果款筑,將透明圖與圖片合并智蝠,避免出現(xiàn)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;
}