關(guān)于圖片圓角的芍瑞,用到了大量圓角圖片晨仑。然而,系統(tǒng)圓角會導(dǎo)致離屏渲染的問題,出于性能考慮洪己,于是有了圖片圓角渲染工具HJCornerRadius妥凳,其最大優(yōu)勢在于使用簡單,一行搞定圖片圓角
imageview.aliCornerRadius = 5.0f;
核心思想就是使用圓角圖片替換系統(tǒng)圓角答捕。實際使用時逝钥,確保layer對象的masksToBounds屬性為NO
imageview.layer.masksToBounds = NO
支持pod方式安裝
pod 'HJCornerRadius', :git => "https://github.com/panghaijiao/HJCornerRadius.git"
當(dāng)然,本文的目的不是介紹如何使用該工具拱镐,而是想跟大家分享開發(fā)時用到的幾點設(shè)計思想
自觀察的巧妙應(yīng)用
既然要生成圓角圖片艘款,首先要解決生成時機問題∥掷牛可能會有朋友想到swizzle類UIImageView的setImage方法哗咆,但我個人并不推薦,畢竟Swizzle類方法影響范圍太廣益眉,對于大型開發(fā)團隊岳枷,出問題后很難排查定位問題所在。定義UIImageView子類呜叫?實用性不強空繁!
還記得我在文章《“自釋放”在iOS開發(fā)中的應(yīng)用》 中提到的實現(xiàn)自釋放的三種方式嗎?其中一種方式就是動態(tài)屬性觀察者——通過創(chuàng)建一個動態(tài)屬性KVO被觀察對象的某一屬性朱庆,從而達到自監(jiān)控的目的盛泡。
通過創(chuàng)建動態(tài)屬性觀察者HJImageObserver,監(jiān)聽UIImageView的image屬性娱颊,當(dāng)image發(fā)生變化時傲诵,能夠立即觸發(fā)圓角圖片的生成,從而達到自動實現(xiàn)圓角圖片替換的目的箱硕,具體實現(xiàn)可以參考源碼 HJCornerRadius
RunLoop的適當(dāng)切換
細(xì)心的朋友可能注意到拴竹,本工具并不是直接渲染原始Image對象,而是先截取UIImageView視圖Layer生成的Image剧罩,然后再做渲染栓拜。原因很簡單,因為UIImageView呈現(xiàn)方式涉及多種ContentMode惠昔,通過渲染UIImageView視圖Layer生成的圖片可以巧妙的解決UIImageView顯示模式的問題
此外幕与,由于系統(tǒng)原因,對于像UITableViewCell的UIImageView镇防,第一次創(chuàng)建賦圖時啦鸣,可能無法獲取UIImageView視圖Layer的圖片,此時来氧,可以通過切換異步RunLoop達到延時渲染的目的
眾所周知诫给,截圖渲染的邏輯是可以運行在工作線程香拉,但是本工具并沒有把它們放在工作線程執(zhí)行,因為放在工作線程會有延遲中狂,從而導(dǎo)致圖片閃爍的現(xiàn)象
具體截圖渲染代碼如下
UIGraphicsBeginImageContextWithOptions(self.originImageView.bounds.size, NO, [UIScreen mainScreen].scale);
CGContextRef currnetContext = UIGraphicsGetCurrentContext();
CGContextAddPath(currnetContext, [UIBezierPath bezierPathWithRoundedRect:self.originImageView.bounds cornerRadius:self.cornerRadius].CGPath);
CGContextClip(currnetContext);
[self.originImageView.layer renderInContext:currnetContext];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
if ([image isKindOfClass:[UIImage class]]) {
image.aliCornerRadius = YES;
self.originImageView.image = image;
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[self updateImageView];
});
}
經(jīng)過實際測試驗證凫碌,效果還是比較理想的,即使需要顯示大量圓角圖片吃型,顯示幀數(shù)也可以穩(wěn)定在50幀以上证鸥。CPU消耗影響較小僚楞,以iPhone6測試顯示勤晚,CPU實際消耗上漲不會超過5%,屬于合理范圍之內(nèi)
本文轉(zhuǎn)自:http://www.olinone.com/