iOS开发 高性能添加圆角(支持4个不同半径)

在开发中,添加圆角似乎再常见不过了。不过它带来的性能问题以及离屏渲染问题,也受到部分开发者的注意。

如何才能在不影响性能的前提下添加圆角呢?

相信大家也看过很多博客,写得也很不错,都是这种解决办法。我随便列举几个

  • 通过设置 CALayermask属性来切,这个无法避免离屏渲染,不推荐。
  • 通过 UIGraphicsBeginImageContextWithOptions()创建一个 Image 的图形上下文,在上面绘制 path 并裁剪,最终生成新的 UIImage,这个可行,但是图片尺寸是有限制的,如果 size 过大,会导致内存暴涨,扛不住,直接GG
  • iOS 9 之后,UIImageView设置png格式的图片时,并且没有 backgroundColor时,设置其 layercornerRadius不会触发离屏渲染。

好消息!好消息!WWCD 2018 告诉我们,有 UIGraphicsImageRenderer这么一个类,它比 UIGraphicsBeginImageContextWithOptions()这个方法要降低75%的内存消耗!

坏消息是什么?它只支持 iOS 10 以上的版本。

那么 iOS 10 之前,我们只能用 CGBitmapContextCreate()来创建位图的上下文。其缺点是坐标系的 y 轴是反的,可能不是很习惯,而且切记要 release
我看 SDWebImage 也是这么做的。

我写了几个 Categories ,支持给 UIView及其子类添加(之后可修改)圆角,或者给 UIImage添加圆角。支持4个圆角半径大小不同。
另外还扩展了:生成简单渐变色的图片、纯色图片、截屏功能(将layer渲染到UIImage并可以添加圆角)
支持 Cocoapods 安装,上地址:QQCorner

iOS开发 高性能添加圆角(支持4个不同半径)_第1张图片
iOS开发 高性能添加圆角(支持4个不同半径)_第2张图片


存在的问题:

我发现用 CGBitmapContextCreate()创建的上下文,里面的 path 不能被裁剪,否则的话边框是绘制不出来的。
这个 path 是 UIBezierPathUIBezierPathclip方法不起作用,此时可以 fillstroke
如果调用 CGContextClip()则整个path都会被裁掉,即不能fillstroke,但是它是有效的。
UIGraphicsBeginImageContextWithOptions()或者 UIGraphicsImageRenderer里面的上下文是没有问题的,UIBezierPathclip方法有效!
所以这个问题搞清楚之前,我在 + (UIImage *)imageWithQQCorner:(QQCorner *)corner size:(CGSize)size;中,iOS 10 之前版本,依然使用了 UIGraphicsBeginImageContextWithOptions()这个方法来创建上下文。

你可能感兴趣的:(开发小心得)