iOS 圓角優化
在iOS開發中經常會遇到需要切圓角的需求,最常見的是用戶頭像。在需要切圓角的圖片數量多的情況下,對性能影響非常大。
我們常用的方法是:
imageView.layer.cornerRadius = aImageView.frame.size.width/2.0;
imageView.layer.masksToBounds = YES;
在這里就不多談 離屏渲染 了,只要知道,使用上面的代碼會發生離屏渲染,頻繁發生離屏渲染非常消耗性能。
優化方案
- 方法1: 保存視圖渲染內容。(略作死)
- 方法2: 對需要切圓角的圖片進行預處理,緩存,顯示。
- 方法3: 覆蓋一個圓形鏤空圖片。
詳解
方法2我覺得不妥,因為每次有新的圖片進來都要預處理,把要顯示的圖片切成圓角,緩存起來。
詳細介紹第三種:
在需要顯示圓角的圖層上覆蓋一個鏤空的圖片,根據顏色,圓角的radius,圖片尺寸,這幾個參數作為key緩存這張鏤空的圖片,下次需要覆蓋的時候去判斷是否已經緩存,復用。
缺點:對視圖的背景有要求,單色背景效果就最為理想。
注意紅色的內容
開發的時候,紅色這個地方應該設置為跟背景同一個顏色。
實際效果
核心代碼如下,我把它寫層一個UIView的分類,拖進自己的工程里邊,import一下就能用了!
- (void)addImageWithCornerRadius:(CGFloat)radius color:(UIColor *)color size:(CGSize)size {
// 根據顏色,圓角程度,尺寸 命名文件
NSString *name = [NSString stringWithFormat:@"%@_%f_%@.png", [color colorComponent], radius, NSStringFromCGSize(size)];
NSString *fullPath = [[self pathWithFolder:@"CornerRadius"] stringByAppendingPathComponent:name];
// 判斷本地是否已經有緩存了
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];
}
// 將生成的圖片覆蓋到當前的圖層上
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.frame = CGRectMake(0, 0, size.width, size.height);
[self addSubview:imageView];
}
來自:http://www.jianshu.com/p/a88d802820d9
本文由用戶 EstelaE22 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!