我有一个子类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:
does导致actionForLayer:forKey:
被打电话。
看来这是因为CALayer
对未定义的属性进行键/值编码有一些魔力。我怎样才能重新创建这个魔力,以便我可以声明属性MyLayer
,但仍然让动画委托观察它们?
最重要的是你需要实施所有CALayer
访问器使用@dynamic
。不使用@synthesize
并且不要直接实现访问器。CALayer
生成它自己的所有属性处理程序(正如您间接发现的那样),并且您需要让它们被使用。
你还需要让CALayer
知道此属性会影响显示(鉴于您的其他评论,您可能已经这样做了)。如果还没有,您可以通过实施来做到这一点+needsDisplayForKey:
并返回YES
给你的钥匙。
这是一个例子CALayer
动画自定义属性(摘自第 7 章iOS 5 编程突破极限 http://robnapier.net/book。完整的示例代码 http://robnapier.net/bookcode可在 Wiley 网站上找到。)该示例实现了actionForKey:
在层中,但如果您愿意,您仍然可以在委托中实现该部分。
@implementation CircleLayer
@dynamic radius;
...
+ (BOOL)needsDisplayForKey:(NSString *)key {
if ([key isEqualToString:@"radius"]) {
return YES;
}
return [super needsDisplayForKey:key];
}
- (id < CAAction >)actionForKey:(NSString *)key {
if ([self presentationLayer] != nil) {
if ([key isEqualToString:@"radius"]) {
CABasicAnimation *anim = [CABasicAnimation
animationWithKeyPath:@"radius"];
anim.fromValue = [[self presentationLayer]
valueForKey:@"radius"];
return anim;
}
}
return [super actionForKey:key];
}
@end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)