iphone - 繰り返し - uiviewkeyframeanimationoptions




CALayerサブクラスのカスタムプロパティのアニメーション化 (2)

はい、可能です(最新のCore Animationリリースでは、iPhone 3.0+やOS X 10.6+など)。

  1. CAがあなたのためにアクセサを実装するようにプロパティを動的にします:

    @dynamic myInt;
    
  2. プロパティの変更が再描画を必要とすることをレイヤに伝えます。

    + (BOOL)needsDisplayForKey:(NSString*)key {
        if ([key isEqualToString:@"myInt"]) {
            return YES;
        } else {
            return [super needsDisplayForKey:key];
        }
    }
    
  3. drawInContext:メソッドでmyIntの値を使用します。 ここで、 myIntをアニメーション化すると、Core Animationはアニメーションの各ステップの値を補間し、繰り返しレイヤーに描画を依頼します。

  4. このプロパティで暗黙のアニメーションも有効にする場合は、 actionForKey:もオーバーライドします。

私はmyLntというNSIntegerプロパティを持つCALayerサブクラスMyLayerを持っています。 私は本当にCABasicAnimationを介してこのプロパティをアニメーション化したいと思いますが、CABasicAnimationはいわゆる "アニメーション化"プロパティ(境界、位置など)でしか動作しないようです。 私のカスタムmyIntプロパティをアニメーション可能にするためにオーバーライドできるものはありますか?


カスタム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:メソッドを上書きする必要もあります。





calayer