一、設定calayer的cornerradius
cornerradius屬性影響layer顯示的background顏色和前景框border,對layer的contents不起作用。故乙個imgview(型別為uiimageview)的image不為空,設定imgview.layer的cornerradius,是看不出顯示圓角效果的,因為image是imgview.layer的contents部分。
這種情況下將layer的maskstobounds屬性設定為yes,可以正確的繪製出圓角效果。但是cornerradius>0,maskstobounds=yes,會觸發gpu的離屏渲染,當乙個螢幕上有多處觸發離屏渲染,會影響效能。通過勾選instruments->core animation->color offscreen-rendered yellow,可以看到螢幕上觸發離屏渲染的會被渲染成黃色。離屏渲染的代價昂貴,蘋果也意識到會產生效能問題,所以ios9以後的系統裡能不產生離屏渲染的地方也就不用離屏渲染了。比如對uiimageview裡png設定圓角不會觸發離屏渲染。
對contents為空的檢視設定圓角
view.backgroundcolor =[
uicolor
redcolor
];view
.layer
.cornerradius =25
;//uilabel設定backgroundcolor的行為被更改,不再是設定layer的背景色而是為contents設定背景色
label
.layer
.backgroundcolor
=acolor
label
.layer
.cornerradius
=5
對contents不為空的檢視設定圓角
imageview.image =[
uiimage
imagenamed:@
"img"
];imageview
.image
.layer
.cornerradius =5
;imageview
.image
.layer
.maskstobounds
=yes
;
二、設定calayer的mask
通過設定view.layer的mask屬性,可以將另乙個layer蓋在view上,也可以設定圓角,但是mask同樣會觸發離屏渲染。
有兩種方式來生成遮罩,一是通過生成,的透明度影響著view繪製的透明度,遮罩透明度為1的部分view被繪製成的透明度為0,相反遮罩透明度為0的部分view被繪製成的透明度為1。二是通過貝塞爾曲線生成,view中曲線描述的形狀部分會被繪製出來。
// 通過生成遮罩,三、通過core graphics重新繪製帶圓角的檢視uiimage
*maskimage =[
uiimage
imagenamed:@
"someimg"
];calayer
*mask =[
calayer
new];
mask
.frame
=cgrectmake(0
,0,maskimage
.size
.width
,maskimage
.size
.height
);mask
.contents =(
__bridge id _nullable
)(maskimage
.cgimage
);view
.layer
.mask
=mask
;//通過貝塞爾曲線生成
cashapelayer
*mask =[
cashapelayer
new];
mask
.path =[
uibezierpath
bezierpathwithovalinrect
:view
.bounds
].cgpath
;view
.layer
.mask
=mask
;
通過cpu重新繪製乙份帶圓角的檢視來實現圓角效果,會大大增加cpu的負擔,而且相當於多了乙份檢視拷貝會增加記憶體開銷。但是就顯示效能而言,由於沒有觸發離屏渲染,所以能保持較高幀率。下例是繪製乙個圓形,繪製其它uiview並無本質區別。重新繪製的過程可以交由後台執行緒來處理。
@implementation四、通過混合圖層uiimage
(circleimage)-
(uiimage
*)drawcircleimage
@end
//在需要圓角時呼叫如下
dispatch_async
(dispatch_get_global_queue
(dispatch_queue_priority_default,0
),^);
});
此方法就是在要新增圓角的檢視上再疊加乙個部分透明的檢視,只對圓角部分進行遮擋。圖層混合的透明度處理方式與mask正好相反。此方法雖然是最優解,沒有離屏渲染,沒有額外的cpu計算,但是應用範圍有限。
總結在可以使用混合圖層遮擋的場景下,優先使用第四種方法。
即使是非ios9以上系統,第一種方法在綜合性能上依然強於後兩者,ios9以上由於沒有了離屏渲染更是首選。
方法二和方法三由於使用了貝塞爾曲線,都可以應對複雜的圓角。只不過前者犧牲幀率,後者需要大量計算和增加部分記憶體,需要實際情況各自取捨。
筆記 圓角四種方法的對比以及效能檢測
這篇文章是繼筆記 ios設定圓角方法以及指定位置設圓角文章而寫的,因為上篇文章發出來後,沒有驗證,也有同行的朋友讓我給出一些測試資料來證實一下,所以這裡就給出一下我個人的一些測試資料,正確是否,還請大家作為參考。另外,我寫這個僅僅只是自己作為筆記使用,原來都是放在草稿裡的,但是手機版的無法檢視草稿,...
PHP遞迴四種方法
data json data str replace data arr json decode data true print r arr dir foreach arr as k v header content type text html charset utf 8 print r arr p...
執行緒同步四種方法
執行緒同步的方法 1 wait 使乙個執行緒處於等待狀態,並且釋放所持有的物件的lock。2 sleep 使乙個正在執行的執行緒處於睡眠狀態,是乙個靜態方法,呼叫此方法要捕捉 interruptedexception異常。3 notify 喚醒乙個處於等待狀態的執行緒,注意的是在呼叫此方法的時候,並...