CATransaction没有观察到CALayer子类的属性

时间:2012-01-20 02:48:15

标签: iphone ios core-animation key-value-coding

我有一个CALayer的子类,其自定义属性声明为:

@interface MyLayer : CALayer
    @property (nonatomic,retain) NSNumber *customValue;
@end
@implementation MyLayer
    @synthesize customValue = _customValue;
@end

我想在显式CATranasction内设置此属性的动画,所以我设置了一个实现了actionForLayer:forKey:方法的委托,该方法返回一个动画,但是对someMyLayerInstance.customValue内部的任何更改都是[CATransaction begin] ... [CATransaction end]不会导致使用相应的“密钥”值调用actionForLayer:forKey

但是,通过调用MyLayer myLayerInstance上的媒体进行核对并对setValue:forKey:进行更改会导致actionForLayer:forKey:被调用。

这似乎是因为CALayer对未定义属性的键/值编码做了一些操作。如何重新创建这个mojo,以便我可以在MyLayer上声明属性,但动画委托仍然可以观察它们?

1 个答案:

答案 0 :(得分:7)

最重要的是,您需要使用CALayer实现所有@dynamic个访问者。不要使用@synthesize并且不要直接实现访问者。 CALayer生成所有自己的属性处理程序(正如您间接发现的那样),您需要让它们被使用。

您还需要让CALayer知道此属性是影响显示的(您可能已经根据其他评论已经完成)。如果还没有,则可以通过实施+needsDisplayForKey:并为您的密钥返回YES来执行此操作。

以下是CALayer动画自定义属性的示例(取自iOS 5 Programming Pushing the Limits的第7章.Wiley网站上提供了完整的sample code。)此示例实现{{ 1}}在图层中,但如果您愿意,仍然可以在委托中实现该部分。

actionForKey: