私の Mac OS X アプリでは、次のコードを使用して、レイヤーに基づくビューのレイヤーに適用された CAAnimation を使用して NSView をアニメーション化しようとしています。
CAAnimation を作成します。
myAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
myAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
myAnimation.fromValue = [NSNumber numberWithFloat:1.0];
myAnimation.toValue = [NSNumber numberWithFloat:0.0];
myAnimation.duration = 3;
myAnimation.repeatCount = 1;
myAnimation.autoreverses = NO;
次に、「myContentView」NSView のレイヤーに追加します。
[self.myContentView.layer removeAllAnimations];
[self.myContentView.layer addAnimation:myAnimation forKey:@"opacity"];
self.myContentView.layer.opacity = 0; //Set final value of opacity to this value
これは実際には正常に動作しますが、アニメーションを実行するたびに (マウス クリックによってトリガーされます)、NSView の親ウィンドウを表示することから始め、その alphaValue を 1 に設定すると、myContentView は最後の不透明度でほんの一瞬だけ表示されます。上記のコードを呼び出したときに表示されていた値で、removeAllAnimations にヒットしました。
これは、presentationLayer がキャッシュに残り、アニメーションが始まる前に再表示されるようなものです。
アニメーションを完全に終了させた場合 (完全にフェードアウトするまでマウス ボタンを長押しすると)、次回は問題ありません。それが残っているように見えるのは、removeAllAnimations によって途中で中断されたときだけです。
ウィンドウを表示するためにすべての呼び出しの前に不透明度を 0 に設定しようとしましたが、それも失敗します。アニメーションを中断しても、レイヤーの不透明度が 0 に設定されない理由がわかりません。
助言がありますか?私は何をしていないのですか?
明確にするために、私は自分でレイヤーを追加しているのではなく、NSView をレイヤーに基づくように設定しているだけです。
私のCAAnimationは、コントローラーをデリゲートとして設定した場合、コントローラーで何も呼び出しません...これも奇妙です。私は確かに何か悪いことをしているに違いありません。
NSView で描画されているものは、ベジェ シェイプを使用して、drawRect: メソッドでプログラムによって行われます。
有効な回避策を見つけました。上記のウィンドウを表示する直前にウィンドウの contentView からビューを削除し、その直後にビューを追加すると、前のアニメーションのゴーストが何らかの形でフラッシュされて表示されなくなります。