一般是通过一下几种方式处理的:
1.直接使用setCornerRadius,直接操作layer。
使用很简单,但这样设置会触发离屏渲染,比较消耗性能。。
2.setCornerRadius设置圆角之后,shouldRasterize=YES光栅化
shouldRasterize=YES设置光栅化,可以使离屏渲染的结果缓存到内存中存为位图, 使用的时候直接使用缓存,节省了一直离屏渲染损耗的性能。但是如果layer及sublayers常常改变的话,它就会一直不停的渲染及删除缓存重新 创建缓存,所以这种情况下建议不要使用光栅化,这样也是比较损耗性能的
3.直接覆盖一张中间为圆形透明的图片
这种方法就是多加了一张透明的图片,GPU计算多层的混合渲染blending也是会消耗 一点性能的,但比第一种方法还是好上很多的
4.UIImage drawInRect绘制圆角
这种方式GPU损耗低内存占用大,而且UIButton上不知道怎么绘制,可以用 UIimageView添加个点击手势当做UIButton使用。
5.SDWebImage处理图片时Core Graphics绘制圆角
使用Instruments的Core Animation查看性能
Color Offscreen-Rendered Yellow
开启后会把那些需要离屏渲染的图层高亮成黄色,这就意味着黄色图层可能存在性能问题。
Color Hits Green and Misses Red
如果shouldRasterize被设置成YES,对应的渲染结果会被缓存,如果图层是绿色,就表示这些缓存被复用;如果是红色就表示缓存会被重复创建,这就表示该处存在性能问题了。
用Instruments测试得
第一种方法,ios9.0之前UIImageView和UIButton都高亮为黄色。ios9.0之后只有UIButton高亮为黄色。
第二种方法UIImageView和UIButton都高亮为绿色
第三种方法,无任何高亮,说明没离屏渲染。 这种圆片覆盖的方法一般只用在底色为纯色的时候,如果圆角图片的父View是张图片的时候就没办法了,而且底色如果是多种颜色的话那 要做多张不同颜色的圆片覆盖。(可以用代码取底色的颜色值给圆片着色)
第四种方法无任何高亮,说明没离屏渲染(但是CPU消耗和内存占用会很大)
第五种方法无任何高亮,说明没离屏渲染,而且内存占用也不大。(暂时感觉是最优方法)
---------------------------------
iOS 保持界面流畅的技巧:
http://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/
---------------------------------
文章的内容主要源自于:https://github.com/walkdianzi/DSRoundedImageArticle
网友评论