在iOS開發(fā)中經(jīng)常會(huì)遇到需要切圓角的需求,最常見的是用戶頭像。在需要切圓角的圖片數(shù)量多的情況下,對(duì)性能影響非常大。
我們常用的方法是:
imageView.layer.cornerRadius = aImageView.frame.size.width/2.0;
imageView.layer.masksToBounds = YES;
在這里就不多談 離屏渲染 了,只要知道,使用上面的代碼會(huì)發(fā)生離屏渲染,頻繁發(fā)生離屏渲染非常消耗性能。
優(yōu)化方案
- 方法1: 保存視圖渲染內(nèi)容。(略作死)
- 方法2: 對(duì)需要切圓角的圖片進(jìn)行預(yù)處理,緩存,顯示。
- 方法3: 覆蓋一個(gè)圓形鏤空?qǐng)D片。
詳解
第一種方法點(diǎn)這里
方法2我覺得不妥,因?yàn)槊看斡行碌膱D片進(jìn)來都要預(yù)處理,把要顯示的圖片切成圓角,緩存起來。
詳細(xì)介紹第三種:
在需要顯示圓角的圖層上覆蓋一個(gè)鏤空的圖片,根據(jù)顏色,圓角的radius,圖片尺寸,這幾個(gè)參數(shù)作為key緩存這張鏤空的圖片,下次需要覆蓋的時(shí)候去判斷是否已經(jīng)緩存,復(fù)用。
缺點(diǎn):對(duì)視圖的背景有要求,單色背景效果就最為理想。
注意紅色的內(nèi)容
開發(fā)的時(shí)候,紅色這個(gè)地方應(yīng)該設(shè)置為跟背景同一個(gè)顏色。
實(shí)際效果
核心代碼如下,我把它寫層一個(gè)UIView的分類,拖進(jìn)自己的工程里邊,import一下就能用了!
完整代碼鏈接 << 點(diǎn)這里
- (void)addImageWithCornerRadius:(CGFloat)radius color:(UIColor *)color size:(CGSize)size {
// 根據(jù)顏色,圓角程度,尺寸 命名文件
NSString *name = [NSString stringWithFormat:@"%@_%f_%@.png", [color colorComponent], radius, NSStringFromCGSize(size)];
NSString *fullPath = [[self pathWithFolder:@"CornerRadius"] stringByAppendingPathComponent:name];
// 判斷本地是否已經(jīng)有緩存了
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL isExists = [fileManager fileExistsAtPath:fullPath];
UIImage *image;
if (isExists) {
// 從緩存中獲取
image = [UIImage imageNamed:fullPath];
} else {
// 緩存中沒有 -> 生成圖片 -> 保存
image = [self getImageWithSize:size color:color radius:radius];
NSData *data = UIImagePNGRepresentation(image);
[data writeToFile:fullPath atomically:YES];
}
// 將生成的圖片覆蓋到當(dāng)前的圖層上
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.frame = CGRectMake(0, 0, size.width, size.height);
[self addSubview:imageView];
}