一般是通過一下幾種方式處理的:
1.直接使用setCornerRadius,直接操作layer。
使用很簡單,但這樣設(shè)置會觸發(fā)離屏渲染,比較消耗性能。。
2.setCornerRadius設(shè)置圓角之后,shouldRasterize=YES光柵化
shouldRasterize=YES設(shè)置光柵化,可以使離屏渲染的結(jié)果緩存到內(nèi)存中存為位圖, 使用的時候直接使用緩存,節(jié)省了一直離屏渲染損耗的性能。但是如果layer及sublayers常常改變的話,它就會一直不停的渲染及刪除緩存重新 創(chuàng)建緩存,所以這種情況下建議不要使用光柵化,這樣也是比較損耗性能的
3.直接覆蓋一張中間為圓形透明的圖片
這種方法就是多加了一張透明的圖片,GPU計(jì)算多層的混合渲染blending也是會消耗 一點(diǎn)性能的,但比第一種方法還是好上很多的
4.UIImage drawInRect繪制圓角
這種方式GPU損耗低內(nèi)存占用大,而且UIButton上不知道怎么繪制,可以用 UIimageView添加個點(diǎn)擊手勢當(dāng)做UIButton使用。
5.SDWebImage處理圖片時Core Graphics繪制圓角
使用Instruments的Core Animation查看性能
Color Offscreen-Rendered Yellow
開啟后會把那些需要離屏渲染的圖層高亮成黃色,這就意味著黃色圖層可能存在性能問題。
Color Hits Green and Misses Red
如果shouldRasterize被設(shè)置成YES,對應(yīng)的渲染結(jié)果會被緩存,如果圖層是綠色,就表示這些緩存被復(fù)用;如果是紅色就表示緩存會被重復(fù)創(chuàng)建,這就表示該處存在性能問題了。
用Instruments測試得
第一種方法,ios9.0之前UIImageView和UIButton都高亮為黃色。ios9.0之后只有UIButton高亮為黃色。
第二種方法UIImageView和UIButton都高亮為綠色
第三種方法,無任何高亮,說明沒離屏渲染。 這種圓片覆蓋的方法一般只用在底色為純色的時候,如果圓角圖片的父View是張圖片的時候就沒辦法了,而且底色如果是多種顏色的話那 要做多張不同顏色的圓片覆蓋。(可以用代碼取底色的顏色值給圓片著色)
第四種方法無任何高亮,說明沒離屏渲染(但是CPU消耗和內(nèi)存占用會很大)
第五種方法無任何高亮,說明沒離屏渲染,而且內(nèi)存占用也不大。(暫時感覺是最優(yōu)方法)
---------------------------------
iOS 保持界面流暢的技巧:
http://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/
---------------------------------
文章的內(nèi)容主要源自于:https://github.com/walkdianzi/DSRoundedImageArticle