iOS 圓角優化

EstelaE22 7年前發布 | 9K 次閱讀 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!