UIImageView添加圓角的幾種方法

喜歡我的可以關(guān)注收藏我的個人博客:RobberJJ

創(chuàng)建一個UIImageView對象:

UIImageView * poImgView = [[UIImageView alloc] init];

<h6>第一種方法</h6>

poImgView.layer.cornerRadius = poImgView.frame.size.width/2.0;
poImgView.layer.masksToBounds = YES;
(或者 poImgView.clipsToBounds = YES;)

clipsToBounds是對view的切割,masksToBounds是對layer的切割。

性能消耗:
這個是離屏渲染(off-screen-rendering),對性能消耗比較大。
fps大致在45幀左右(每個cell 做2個imageview)(正常fps是60幀,越小,用戶體驗越差)。

離屏渲染,指的是GPU在當(dāng)前屏幕緩沖區(qū)以外新開辟一個緩沖區(qū)進行渲染操作。由上面的一個結(jié)論視圖和圓角的大小對幀率并沒有什么卵影響,數(shù)量才是傷害的核心輸出啊??梢灾离x屏渲染耗時是發(fā)生在離屏這個動作上面,而不是渲染。為什么離屏這么耗時?原因主要有創(chuàng)建緩沖區(qū)和上下文切換。創(chuàng)建新的緩沖區(qū)代價都不算大,付出最大代價的是上下文切換。

<h6>第二種方法</h6>

CAShapeLayer *layer = [CAShapeLayer layer];  
UIBezierPath *aPath = [UIBezierPath bezierPathWithOvalInRect:aImageView.bounds];  
layer.path = aPath.CGPath;  
poImgView.layer.mask = layer;

性能消耗:
測試fps大致在20幀左右,比方案A的消耗更大。

<h6>第三種方法</h6>

- (UIImage *)imageWithCornerRadius:(CGFloat)radius {
    CGRect rect = (CGRect){0.f, 0.f, self.size};
    UIGraphicsBeginImageContextWithOptions(self.size, NO, UIScreen.mainScreen.scale);
    CGContextAddPath(UIGraphicsGetCurrentContext(),[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius].CGPath);
    CGContextClip(UIGraphicsGetCurrentContext());
    [self drawInRect:rect];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

性能消耗:
這個是on-screen-rendering
相當(dāng)于時時去做渲染,相比于A.B方案的離線渲染,此方法對性能消耗最低,推薦用此方案。

<h6>值得一提</h6>
第一種跟第二種方法都是比較常見的方式,但是都不推薦,對此的優(yōu)化方案是是用第三種方式,但是如果非要使用第一種跟第二種,補救措施是:

self.layer.shouldRasterize = YES;  
self.layer.rasterizationScale = [UIScreen mainScreen].scale;

當(dāng)shouldRasterize設(shè)成true時,layer被渲染成一個bitmap,并緩存起來,等下次使用時不會再重新去渲染了。

實現(xiàn)圓角本身就是在做顏色混合(blending),如果每次頁面出來時都blending,消耗太大,這時shouldRasterize = yes,下次就只是簡單的從渲染引擎的cache里讀取那張bitmap,節(jié)約系統(tǒng)資源。

如果在滾動tableView時,每次都執(zhí)行圓角設(shè)置,肯定會阻塞UI,設(shè)置這個將會使滑動更加流暢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在本系列上一篇《iOS 2D Graphic(1)—— Concept 基本概念和原理》中,我們已經(jīng)了解了關(guān)于iO...
    ac3閱讀 2,393評論 2 11
  • 客戶端的開發(fā),無非離不開數(shù)據(jù)和展示,而展示這個方面,首當(dāng)其沖的就是視圖、動畫的渲染,切換等等。而且在用戶的使用中,...
    ttdiOS閱讀 2,854評論 0 6
  • Hibernate查詢方式: 1.導(dǎo)航對象圖檢索方式:根據(jù)已有對象導(dǎo)航到其他對象 2.OID檢索:對象OID檢索對...
    又是那一片天閱讀 307評論 0 0
  • 【186】 感覺自己有千言萬語想說,卻都欲言又止。以前覺得,不過是高三,考不到心愛的學(xué)校,那么復(fù)讀也不算什么的。...
    楠渡閱讀 275評論 0 1
  • ‘’當(dāng)火車開入這座陌生的城市,那是從來就沒有見過的霓虹‘’。 從沒出過遠門的我懷著要去體會下不同的打工經(jīng)歷,也想著...
    沉香公子閱讀 416評論 0 0

友情鏈接更多精彩內(nèi)容