gpt4 book ai didi

objective-c - 确实-[CALayer drawInContext :] do something?

转载 作者:行者123 更新时间:2023-11-28 19:21:05 26 4
gpt4 key购买 nike

According to documentation 默认实现不执行任何操作。

但是...我从 drawRect 方法中抛出异常并且我看到了下一个调用堆栈

3   EasyWakeup                          0x0003a7b6 -[AlarmIntervalView drawRect:] + 71
4 UIKit 0x003f6187 -[UIView(CALayerDelegate) drawLayer:inContext:] + 426
5 QuartzCore 0x011a8b5e -[CALayer drawInContext:] + 143

据我所知,这意味着 -[CALayer drawInContext:] 调用的默认实现委托(delegate)方法。这是对的吗?因为我知道 swizzling 技术,所以我不确定 objective-c 中的任何内容......

最佳答案

你是对的,CALayer 的默认 drawInContext: 什么都不做。这是真的,除非该层有一个委托(delegate)并且该层的委托(delegate)实现drawLayer:inContext:。所以文档的问题是它应该在声明“默认实现不执行任何操作”旁边有一个小星号。

请记住,所有 View 都由某种 CALayer 支持。该层自动设置为将其 View 设置为其委托(delegate)。表面上看不出来的是 UIView 确实实现了 CALayer 的委托(delegate) drawLayer:inContext:。这就是您在调用堆栈中看到的所有这些调用。

您的 AlarmIntervalView 实例自动具有一个支持层,并且该支持层将其委托(delegate)设置为您的 AlarmIntervalView 实例。系统的某些部分调用支持层的 drawInContext: 检查委托(delegate)(它有),发送委托(delegate) respondsToSelector:drawLayer:inContext: 作为参数(UIView 确实响应),最后实际发送消息 drawLayer:inContext:。 UIView 的 drawLayer:inContext: 实现会调用您的 View 的 drawRect:

我不太确定你为什么提到 swizzling。

[我的回复很长,主要是为了我的利益。它也帮助我学习。]

关于objective-c - 确实-[CALayer drawInContext :] do something?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8813164/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com