iOS設定圓角的四種方法

2021-07-22 22:08:05 字數 2850 閱讀 3410

一、設定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中曲線描述的形狀部分會被繪製出來。

// 通過生成遮罩,

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

;

三、通過core graphics重新繪製帶圓角的檢視

通過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 喚醒乙個處於等待狀態的執行緒,注意的是在呼叫此方法的時候,並...