Core Animation CALayerのbackgroundColorプロパティをアニメーション化するためにCABasicAnimationを構築しようとしていますが、CGColorRef値を適切にラップしてアニメーションに渡す方法がわかりません。例えば:
CGColorSpaceRef rgbColorspace = CGColorSpaceCreateDeviceRGB();
CGFloat values[4] = {1.0, 0.0, 0.0, 1.0};
CGColorRef red = CGColorCreate(rgbColorspace, values);
CGColorSpaceRelease(rgbColorspace);
CABasicAnimation *selectionAnimation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
[selectionAnimation setDuration:0.5f];
[selectionAnimation setToValue:[NSValue valueWithPointer:red]];
[layer addAnimation:selectionAnimation forKey:@"selectionAnimation"];
backgroundColorプロパティには何の影響も与えないようです。これは、NSValueにラップされたポインタとして渡すことは、それを渡す方法ではないためだと思います。
backgroundColorはCALayerのアニメート可能なプロパティなので、私の質問は、この特定のプロパティのFrom値またはTo値をどのように設定するか(できればMac/iPhoneプラットフォームに依存しない方法で)ですか?
CGColorRef
のtoValue
またはfromValue
プロパティを設定するときに、CABasicAnimation
sをラップする必要はありません。 CGColorRef
を使用するだけです。コンパイラの警告を回避するために、CGColorRef
をid
にキャストできます。
私のサンプルアプリでは、次のコードが背景を赤にアニメーション化しました。
CABasicAnimation* selectionAnimation = [CABasicAnimation
animationWithKeyPath:@"backgroundColor"];
selectionAnimation.toValue = (id)[UIColor redColor].CGColor;
[self.view.layer addAnimation:selectionAnimation
forKey:@"selectionAnimation"];
ただし、アニメーションが終了すると、背景は元の色に戻ります。これは、CABasicAnimation
が、アニメーションの実行中にターゲットレイヤーのプレゼンテーションレイヤーにのみ影響するためです。アニメーションが終了すると、モデルレイヤーで設定された値が返されます。したがって、layers backgroundColor
プロパティも赤に設定する必要があります。おそらく、CATransaction
を使用して暗黙のアニメーションをオフにします。
そもそも暗黙のアニメーションを使用することで、この問題を回避できます。
実験的に障害を見つけるまで、私はこの問題に苦労していました。レイヤーのbackgroundColorプロパティを直接またはアニメーションを介して設定しても、当然のことながら、アイテム(UILabelなど)のコンテキストで、Interface Builderのデフォルト(指定なし)から背景色を変更しても効果はありません。 IBに配置されました。したがって、背景色は指定しないでおくと、上記が機能するはずです。