当前位置:  开发笔记 > 编程语言 > 正文

观察派生属性的变化:CALayer KVO示例

如何解决《观察派生属性的变化:CALayerKVO示例》经验,为你挑选了1个好方法。

有没有办法观察派生属性的变化?例如,我想知道何时添加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问题.我该怎么办?提前致谢!



1> Alex..:

好吧,superlayer被定义为一个readonly属性,这意味着没有setSuperlayer:方法.(如果有,它将是私有的,你可能不应该使用它.)如果我不得不猜测,那就是该superlayer属性不符合KVO标准.而且,除此之外,我通常不认为课堂观察自己是一个好主意.

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

不过,我认为这也是一个非常混乱的黑客.但它应该比自己使用自定义图层以及弄乱KVO消息更加"自足".

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有