1

私の 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 からビューを削除し、その直後にビューを追加すると、前のアニメーションのゴーストが何らかの形でフラッシュされて表示されなくなります。

4

0 に答える 0