动画CALayer子类的自定义属性

我有一个CALayer子类MyLayer,它有一个名为myInt的NSInteger属性。 我真的很想通过CABasicAnimation来动画这个属性,但是看起来CABasicAnimation只能用于所谓的“动画”属性(边界,位置等)。 有什么我可以重写,使我的自定义myInt属性动画?


是的,这是可能的(只有在最新的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];
        }
    }
    
  • drawInContext:方法中使用myInt的值。 现在,当您为myInt设置动画myInt ,Core Animation将插入动画每一步的值,并重复要求图层自行绘制。

  • 如果您还想为此属性启用隐式动画,还可以覆盖actionForKey:


  • 有一种方法可以保留自定义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:方法。

    链接地址: http://www.djcxy.com/p/74163.html

    上一篇: Animating a custom property of CALayer subclass

    下一篇: [CALayer setNeedsDisplayInRect:]