有没有办法观察派生属性的变化?例如,我想知道何时添加CALayer作为子图层,以便我可以相对于其(新)父级调整其几何.
所以,我有一个子类CALayer,比如CustomLayer,我想我可以在init中为该属性注册一个观察者:
[self addObserver:self forKeyPath:@"superlayer" options:0 context:nil]
并实施observeValueForKeyPath:ofObject:change:context
.什么都没发生,因为,大概是,superlayer是派生属性(attr字典存储父母的不透明ID).同样,我不能继承子类,setSuperlayer:
因为它永远不会被调用.实际上,据我所知,当父进程时,子层上没有设置实例方法或公共属性[self addSublayer:aCustomLayer]
.
然后我想,好吧,我会像这样继承addSublayer:
- (void)addSublayer:(CALayer *)aLayer { [aLayer willChangeValueForKey:@"superlayer"]; [super addSublayer:aLayer]; [aLayer didChangeValueForKey:@"superlayer"]; }
但仍然没有!(也许这是一个线索,当我创建一个简单的独立测试类并使用它will[did]ChangeValueForKey:
然后它工作.)这可能是一个更普遍的Cocoa KVO问题.我该怎么办?提前致谢!
好吧,superlayer
被定义为一个readonly
属性,这意味着没有setSuperlayer:
方法.(如果有,它将是私有的,你可能不应该使用它.)如果我不得不猜测,那就是该superlayer
属性不符合KVO标准.而且,除此之外,我通常不认为课堂观察自己是一个好主意.
也许有另一种方法可以做到这一点.将图层添加到超级图层时,onOrderIn
会发生操作.现在,actionForKey:
是一个实例方法,它为图层提供了为某些属性自定义默认动画的机会.您可以覆盖actionForKey:
以检测操作何时onOrderIn
发生,执行您的操作,然后调用其super
实现.
不过,我认为这也是一个非常混乱的黑客.但它应该比自己使用自定义图层以及弄乱KVO消息更加"自足".