我有一个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
上声明属性,但动画委托仍然可以观察它们?
答案 0 :(得分:7)
最重要的是,您需要使用CALayer
实现所有@dynamic
个访问者。不要使用@synthesize
并且不要直接实现访问者。 CALayer
生成所有自己的属性处理程序(正如您间接发现的那样),您需要让它们被使用。
您还需要让CALayer
知道此属性是影响显示的(您可能已经根据其他评论已经完成)。如果还没有,则可以通过实施+needsDisplayForKey:
并为您的密钥返回YES
来执行此操作。
以下是CALayer
动画自定义属性的示例(取自iOS 5 Programming Pushing the Limits的第7章.Wiley网站上提供了完整的sample code。)此示例实现{{ 1}}在图层中,但如果您愿意,仍然可以在委托中实现该部分。
actionForKey: