gpt4 book ai didi

objective-c - 观察派生属性的变化: CALayer KVO example

转载 作者:行者123 更新时间:2023-12-03 16:50:01 25 4
gpt4 key购买 nike

有没有办法观察派生属性的变化?例如,我想知道 CALayer 何时被添加为子图层,以便我可以相对于其(新)父图层调整其几何形状。

所以,我有一个子类 CALayer,比如 CustomLayer,我想我可以在 init 中为该属性注册一个观察者:

[self addObserver:self forKeyPath:@"superlayer" options:0 context:nil]

并实现observeValueForKeyPath:ofObject:change:context。什么也没有发生,因为大概 superlayer 是一个派生属性(attr 字典存储父级的不透明 ID)。同样,我无法子类 setSuperlayer: 因为它从未被调用。事实上,据我所知,当父级执行 [self addSublayer:aCustomLayer] 时,子层上没有调用实例方法或设置公共(public)属性。

然后我想,好吧,我将像这样子类化 addSublayer :

- (void)addSublayer:(CALayer *)aLayer {
[aLayer willChangeValueForKey:@"superlayer"];
[super addSublayer:aLayer];
[aLayer didChangeValueForKey:@"superlayer"];
}

但还是什么都没有! (也许这是一个线索,当我创建一个简单的独立测试类并使用 will[did]ChangeValueForKey: 时,它就会起作用。)这可能是一个更普遍的 Cocoa KVO 问题。我应该做什么?提前致谢!

最佳答案

嗯,superlayer 被定义为 readonly 属性,这意味着没有 setSuperlayer: 方法。 (如果有,它将是私有(private)的,您可能不应该使用它。)如果我不得不猜测,那就是 superlayer 属性不符合 KVO。而且,除此之外,我通常认为类(class) self 观察并不是一个好主意。

也许还有另一种方法可以做到这一点。将图层添加到 super 图层时,会发生 onOrderIn 操作。现在,actionForKey: 是一个实例方法,它为图层提供了自定义某些属性的默认动画的机会。您可以重写 actionForKey: 来检测 onOrderIn 操作何时发生,执行您的操作,然后调用 super 的实现。

不过,我认为这也是一个非常困惑的黑客行为。但它应该比必须对所有内容使用自定义层并弄乱 KVO 消息更加“独立”。

关于objective-c - 观察派生属性的变化: CALayer KVO example,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/710127/

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