喜歡我的可以關(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è)置這個將會使滑動更加流暢。