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

设置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 方法,这其中更是涉及到图形上下文的转换。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值