web-dev-qa-db-ja.com

CALayerのbackgroundColorを明示的にアニメーション化するにはどうすればよいですか?

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プラットフォームに依存しない方法で)ですか?

34
Brad Larson

CGColorReftoValueまたはfromValueプロパティを設定するときに、CABasicAnimationsをラップする必要はありません。 CGColorRefを使用するだけです。コンパイラの警告を回避するために、CGColorRefidにキャストできます。

私のサンプルアプリでは、次のコードが背景を赤にアニメーション化しました。

CABasicAnimation* selectionAnimation = [CABasicAnimation 
    animationWithKeyPath:@"backgroundColor"];
selectionAnimation.toValue = (id)[UIColor redColor].CGColor;
[self.view.layer addAnimation:selectionAnimation
                       forKey:@"selectionAnimation"];

ただし、アニメーションが終了すると、背景は元の色に戻ります。これは、CABasicAnimationが、アニメーションの実行中にターゲットレイヤーのプレゼンテーションレイヤーにのみ影響するためです。アニメーションが終了すると、モデルレイヤーで設定された値が返されます。したがって、layers backgroundColorプロパティも赤に設定する必要があります。おそらく、CATransactionを使用して暗黙のアニメーションをオフにします。

そもそも暗黙のアニメーションを使用することで、この問題を回避できます。

58
Jason Medeiros

実験的に障害を見つけるまで、私はこの問題に苦労していました。レイヤーのbackgroundColorプロパティを直接またはアニメーションを介して設定しても、当然のことながら、アイテム(UILabelなど)のコンテキストで、Interface Builderのデフォルト(指定なし)から背景色を変更しても効果はありません。 IBに配置されました。したがって、背景色は指定しないでおくと、上記が機能するはずです。

2
Phil Oliver