Dfo*_*owj 3 iphone core-animation key-value-coding ios
我有一个CALayer自定义属性的子类,声明如下:
@interface MyLayer : CALayer
@property (nonatomic,retain) NSNumber *customValue;
@end
@implementation MyLayer
@synthesize customValue = _customValue;
@end
Run Code Online (Sandbox Code Playgroud)
我想在显式内部对此属性进行动画处理CATranasction,因此我使用actionForLayer:forKey:实现的方法设置一个委托,该方法返回一个动画,但是对someMyLayerInstance.customValue内部的任何更改[CATransaction begin] ... [CATransaction end]都不会导致actionForLayer:forKey使用相应的"key"值进行调用.
然而,通过调用MyLayer来修改属性并进行更改会导致调用.myLayerInstancesetValue:forKey: actionForLayer:forKey:
看起来这是因为CALayer对于未定义属性的键/值编码有一些mojo.我如何重新创建这个mojo以便我可以声明属性MyLayer,但仍然可以让动画委托观察它们?
最重要的是您需要使用实现所有CALayer访问器@dynamic.不要直接使用@synthesize也不要实现访问者.CALayer生成所有自己的属性处理程序(正如你间接发现的那样),你需要让它们被使用.
您还需要CALayer知道此属性对显示有影响(您可能已经根据其他注释执行了此操作).如果还没有,可以通过实现+needsDisplayForKey:并返回YES密钥来实现.
这是一个CALayer动画自定义属性的示例(取自iOS 5编程推动限制的第7章.完整的示例代码可在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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
903 次 |
| 最近记录: |