我有一个CALayer子类MyLayer,它有一个名为myInt的NSInteger属性。我真的想通过CABasicAnimation为这个属性设置动画,但似乎CABasicAnimation只适用于所谓的“动画”属性(边界,位置等)。有什么我可以覆盖,以使我的自定义myInt属性可动画?
答案 0 :(得分:68)
是的,这是可能的(但我认为,仅在最新的Core Animation版本中,即iPhone 3.0+和OS X 10.6 +)。
使您的属性动态化,以便CA为您实现访问者:
@dynamic myInt;
告诉图层属性的更改需要重绘:
+ (BOOL)needsDisplayForKey:(NSString*)key {
if ([key isEqualToString:@"myInt"]) {
return YES;
} else {
return [super needsDisplayForKey:key];
}
}
在myInt
方法中使用drawInContext:
的值。现在,当您为myInt
设置动画时,Core Animation将为动画的每个步骤插值,并反复要求图层绘制自己。
如果您还想为此属性启用隐式动画,请同时覆盖actionForKey:
。
答案 1 :(得分:6)
是一种保留自定义CALayer子类的iVars的方法。您覆盖initWithLayer:,该方法被调用以创建自定义图层的副本。例如,如果您有一个要在其中创建名为“angle”的自定义属性的图层,则可以使用以下代码:
@implementation AngledLayer
@synthesize angle = _angle
// Tell Core Animation that this key should be animated
+ (BOOL) needsDisplayForKey:(NSString *)key
{
if ([key isEqualToString:@"angle"]) return YES;
return [super needsDisplayForKey:key];
}
// Make sure that, when the layer is copied, so is the custom ivar
- (id) initWithLayer:(id)layer
{
self = [super initWithLayer:layer];
if (self) {
AngledLayer *angledVersion = (AngledLayer *)layer;
self.angle = angledVersion.angle;
}
return self;
}
鲍勃是你的叔叔!请注意,您不能将此对象与隐式动画一起使用,您还必须覆盖actionForKey:方法。
答案 2 :(得分:0)
Swift 版本
// Custom property
@NSManaged public var progress: CGFloat
open override class func needsDisplay(forKey key: String) -> Bool {
if key == "progress" {
return true
}
return super.needsDisplay(forKey: key)
}