Animating a custom property of CALayer subclass

I have a CALayer subclass, MyLayer, that has a NSInteger property called myInt. I'd really like to animate this property via CABasicAnimation, but it seems CABasicAnimation only works on so-called "animatable" properties (bounds, position, etc). Is there something I can override to make my custom myInt property animatable?


Yes, it's possible (only in the latest Core Animation releases though, I believe, ie iPhone 3.0+ and OS X 10.6+).

  • Make your property dynamic so that CA implements the accessors for you:

    @dynamic myInt;
    
  • Tell the layer that changes of the property require redrawing:

    + (BOOL)needsDisplayForKey:(NSString*)key {
        if ([key isEqualToString:@"myInt"]) {
            return YES;
        } else {
            return [super needsDisplayForKey:key];
        }
    }
    
  • Use the value of myInt in your drawInContext: method. Now, when you animate myInt , Core Animation will interpolate the values for each step of the animation and repeatedly ask the layer to draw itself.

  • If you also want to enable implicit animations for this property, also override actionForKey: .


  • There is a way to retain the iVars of your custom CALayer subclasses. You override initWithLayer:, the method which is called to create a copy of custom layers. For example, if you have a layer in which you want to create a custom property called 'angle', you might use the following code:

    @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;
    }
    

    And bob's your uncle! Note that you can't use this object with implicit animation, for which you'd also have to overide the actionForKey: method.

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

    上一篇: 在CALayer中为自定义属性设置动画

    下一篇: 动画CALayer子类的自定义属性