レイヤへの変更はすべて、トランザクションの一部として行われます。CATransactionは、複数のレイヤツリーへの変更を描画ツリーへのアトミックな更新として一括処理する役割を果たすCore Animationクラスです。
この章では、Core Animationがサポートする2つのタイプのトランザクション、すなわち、暗黙的なトランザクションと明示的なトランザクションについて説明します。
暗黙的なトランザクションは、レイヤツリーがアクティブなトランザクションなしでスレッドによって変更されると自動的に作成され、スレッドの実行ループの次の反復時に自動的にコミットされます。
リスト 1の例では、結果のアニメーションが同時に実行されるようにする暗黙的なトランザクションを使用して、レイヤのopacityプロパティ、zPositionプロパティ、およびpositionプロパティを変更しています。
リスト 1 暗黙的なトランザクションを使ったアニメーション
theLayer.opacity=0.0; |
theLayer.zPosition=-200; |
thelayer.position=CGPointMake(0.0,0.0); |
レイヤツリーの変更前にCATransactionクラスに class a beginメッセージを送り、その後commitメッセージを送ることにより、明示的なトランザクションを作成します。明示的なトランザクションは、一度に多数のレイヤのプロパティを設定する場合(たとえば複数レイヤのレイアウト時など)、レイヤアクションを一時的に無効にする場合、あるいは結果として生じた暗黙的なアニメーションの再生時間を一時的に変更する場合などに特に役立ちます。
トランザクションのkCATransactionDisableActionsの値をtrueに設定することによって、レイヤのプロパティ値の変更時にレイヤのアクションを一時的に無効にすることができます。そのトランザクションの範囲内でどのような変更が行われても、アニメーションは生じません。リスト 2に、可視のレイヤツリーからaLayerを削除したときに発生するフェードアニメーションを無効にする例を示します。
リスト 2 レイヤのアクションを一時的に無効にする
[CATransaction begin]; |
[CATransaction setValue:(id)kCFBooleanTrue |
forKey:kCATransactionDisableActions]; |
[aLayer removeFromSuperlayer]; |
[CATransaction commit]; |
トランザクションのkCATransactionAnimationDurationキーの値に異なる再生時間を設定することによって、レイヤプロパティの変更を受けて実行するアニメーションの再生時間を一時的に変更できます。そのトランザクションの範囲内で生じるすべてのアニメーションは、自身の時間ではなくその再生時間を使用します。リスト 3に、アニメーションをzPositionおよびopacityアニメーションによって指定された再生時間よりも10秒長く再生させる例を示します。
リスト 3 アニメーションの再生時間のオーバーライド
[CATransaction begin]; |
[CATransaction setValue:[NSNumber numberWithFloat:10.0f] |
forKey:kCATransactionAnimationDuration]; |
theLayer.zPosition=200.0; |
theLayer.opacity=0.0; |
[CATransaction commit]; |
上記の例は、明示的なトランザクションであるbeginとcommitによって囲まれた再生時間を示していますが、これらを省略して暗黙的なトランザクションを代わりに使うことも考えられます。
明示的なトランザクションをネストし、アニメーションの一部に対してアクションを無効にすることや、変更されたプロパティの暗黙的なアニメーションに対して異なる再生時間を使用することなどができます。最も外側のトランザクションがコミットされた場合のみ、アニメーションが発生します。
リスト 4に、2つのトランザクションのネストの例を示します。外側のトランザクションは、暗黙的なアニメーションの再生時間を2秒に設定し、レイヤのpositionプロパティを設定します。内側のトランザクションは、暗黙的なアニメーションの再生時間を5秒に設定し、レイヤのopacityとzPositionを設定します。
リスト 4 明示的なトランザクションのネスト
[CATransaction begin];
// アニメーションの再生時間を5秒に変更する
[CATransaction setValue:[NSNumber numberWithFloat:2.0f]
forKey:kCATransactionAnimationDuration];
// レイヤを新しい位置に移動する
theLayer.position = CGPointMake(0.0,0.0);
// ネストしたトランザクションを使って
// zPositionとopacityのアニメーションの
// 再生時間を変更する
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:5.0f]
forKey:kCATransactionAnimationDuration];
theLayer.zPosition=200.0;
theLayer.opacity=0.0;
[CATransaction commit];
[CATransaction commit]; |
Last updated: 2007-12-06