0%

iOS中圆角对性能的影响

iOS中圆角对性能的影响

关于圆角设置问题之前一直存在一些讨论,因为面试中碰到面试官问我这个问题,因为自己的项目中一个界面中用到圆角的个数并不多所以我也没有仔细研究过这个问题,这次趁着这次机会测试一下圆角问题。

圆角设置

首先我们通过系统的api去设置圆角imageView.layer.cornerRadius = 10;
通过设置layer的cornerRadius来设置圆角,但是只设置这个虽然说是成功的设置了圆角。但是cornerRadius这个属性只会影响到视图的背景颜色和border。对于UIlabel和UIImageView这样的内部还有其他视图的控件就不能起作用,所以大部分情况下我们还要设置上imageView.layer.masksToBounds = true。这样才能达到我们的预期效果。

性能问题

首先网上查找关于设置圆角的文章,发现之前说的是设置圆角cornerRadius不会触发离屏渲染,设置masksToBounds才会触发离屏渲染,但是并不是只要设置了就会影响性能,只要当涉及到的视图数量够多才会影响性能,使FPS降低。但是我这边测试发现在最新的系统上测试并没有发现性能问题。这里结合代码说明。

首先创建一个TableViewCell中每行放多个设置了圆角的ImageView
cell中创建圆角视图的代码:

然后打开Xcode中的调试工具Instrument然后选择Core Animation

然后调试后发现当我屏幕中出现很多设置了圆角的ImageView的时候这时候的FPS并没有明显降低,维持在60帧左右,没有出现之前的文章中所说的当一个屏幕中出现超过17个左右的视图后FPS会明显下降,我这里测试的手机是iPhone6S系统时iOS12。

然后打开Xcode中关于离屏渲染的调试选项,这里说明一下之前的离屏渲染相关的debug选项都在Instrument中,从Xcode9之后把这个选项集成到了Xcode的debug选项中,查找路径是在Xcode->Debug->View Debugging->Rendering->Color Offscreen Rendered Yellow然后发现并没有触发离屏渲染。可以看出目前我这个视图中已经有超过50个设置了圆角的ImageView,但是并没有影响到FPS。所以关于圆角设置问题我这边认为,只要不是特别特别负责的视图,或者说明显的FPS很低的时候,不用考虑优化问题,直接设置masksToBoundscornerRadius是没有什么问题的。

其他方法设置圆角

为普通的UIView视图设置圆角的思路通过Core Graphics自己画出了一个圆角矩形,返回的是一个image然后创建一个ImageView视图插入到视图层级的底部。这样就完成了圆角的设置。

ImageView设置圆角,思路是获取ImageView的图片,同样通过Core Graphics将image直接截出圆角。

这个思路是参考这篇文章的。详细的代码可以参考这篇文章,iOS 高效添加圆角效果实战讲解

总结

推荐直接使用系统提供的API直接设置圆角,如果测试后针对某些机型或者系统存在特别严重的问题后再针对性的调试后优化,如果界面不是特别复杂,过早的优化是没有太大必要的。