设置CALayer的delegate时需要注意的问题

版权声明:欢迎大家积极分享!交流。关注我~ https://blog.csdn.net/qinqi376990311/article/details/81975444

设置CALayer的delegate时需要注意的问题

有很多像我这样的开发者在优化 App 性能的时候,很多情况会用 CALayer 代替 UIView

那么我们要让 CALayer 显示内容,可以创建一个类继承于 CALayer,然后重写 -drawInContext 方法。但是如果有很多,就要创建好多类,有点得不偿失。

另一种方法就是实现 CALayer 的 delegate 中的 -drawLayer:inContext: 方法。今天要讨论的就是,如何给 CALayer 设置代理。这里面有很多需要注意的东西。

首先,这个 delegate 一定不能是 UIView!因为 UIView 本身携带的 layer 的代理就是自己,如果你将一个 layer 的代理设置为它,它本身的 layer 就会受影响。通常会因为野指针而崩溃。

其次,这个 delegate 也不能是 UIViewController,如果你将这个 VC push 出来,再 pop 回去,肯定也会崩溃的,原因也是野指针。不过这个野指针可能是由于 VC 先被释放了。

最后,一个还算是可以的解决方案就是,创建一个继承于 NSObject 的工具类,专门来处理 CALayer 的绘制逻辑。举例说明,正确的做法是这样的:

  • 一个 UIView 上有 N 个 CALayer
  • 这个 UIView 一定是自定义视图,绝对不是控制器的 self.view
  • 创建一个工具类,这个 UIView 要持有它的一个实例。控制器行不行?不行!原因上面说过了
  • 将这 N 个 CALayer 的 delegate 属性,都设置为上面的实例
  • 在工具类中,实现 -drawLayer:inContext: 方法,当然里面要根据不同的 layer 绘制不同的内容, 具体的就不用多说了。

上面的步骤是我认为最正确的。原因这里我就不详细解释了,因为涉及到太多底层的东西。想要深究,需要了解 UIView 和 CALayer 的底层知识。举个栗子,

比如说一个 UIView 要显示出来,其实是它里面的 layer 隐式调用 -drawInContext 方法,这个方法会调用它的代理方法 -drawLayer:inContext: ,而这个代理方法最终会调用 -drawRect 方法,这其中更是涉及到图形上下文的转换。

猜你喜欢

转载自blog.csdn.net/qinqi376990311/article/details/81975444