2011-07-24 15 views
2

NSViewのレイヤーのプロパティが編集/誤っているようです。下のコードでは、アニメーションは完全に機能し、すべて正常に見えます。 NSlogsからの出力は常に、次のとおりです。NSView CALayer Opacity Madness

anim over opacity = 1.00000 
first opacity = 0.50000 
current opacity = 0.00000 
updated opacity = 0.00000 

最初の2つのログには、右に見える、そうでもアニメーションが停止した時に、層が正常に動作しているように思われます。しかし、しばらくして不透明度をチェックすると、魔法のように0になってしまいました。レイヤーの不透明度を1に設定した直後にそれを確認しても、それはまだ0です。

レイヤー内でsetneedsdisplayを使用していて、nsviewでsetneedsdisplay:YESと表示され、 が役に立たなかった。どんな提案も大歓迎です。

- (void) someSetupAnimationMethod { 
     aLayer = [CALayer layer]; 
     [theView setWantsLayer:YES]; 
     [theView setLayer:aLayer]; 

     [aLayer setOpacity:0.0]; 
     CABasicAnimation *opacity = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
     opacity.byValue = [NSNumber numberWithFloat:1.0]; 
     opacity.duration = 0.3; 
     opacity.delegate = self; 
     opacity.fillMode = kCAFillModeForwards; 
     opacity.removedOnCompletion = NO; 
     [opacity setValue:@"opacity done" forKey:@"animation"]; 
     [aLayer addAnimation:opacity forKey:nil]; 
    } 

    - (void) animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { 
     if([[anim valueForKey:@"animation"] isEqualToString:@"opacity done"]) { 
      NSLog(@"anim over opacity = %f", aLayer.opacity); 
      aLayer.opacity = 0.5; 
      [aLyaer removeAllAnimations]; 
      NSLog(@"first opacity = %f", aLayer.opacity); 
     } 
    } 

    - (void) someLaterMethod { 
     NSLog(@"current opacity = %f", aLayer.opacity); 
     aLayer.opacity = 1.0; 
     NSLog(@"updated opacity = %f", aLayer.opacity); 
    } 
+0

また、nsviewでレイヤーを設定する適切な方法は何ですか? – Ryan

答えて

8

あなたは層担保ビューを作成し、直接層を操作しようとすることで基本的なCALayer/NSViewルールを破っています。

aLayer = [CALayer layer]; 
[theView setWantsLayer:YES]; 
[theView setLayer:aLayer]; 

あなたがsetLayer:を呼び出す前に層を使用するビューを伝えるとき、ビューは「レイヤー担保」となり - それは単にバッファとして層を使用し、すべての描画され、あなたがやりたいことを実行する必要があります通常のdrawRect:および関連する方法を介して行われる。レイヤーに直接触れることはできません。あなたはこれらの呼び出しの順序を変更した場合:

[theView setLayer:aLayer]; 
[theView setWantsLayer:YES]; 

をあなたは今のビューがちょうどに引き込まれる層のために、画面上のスペースを提供することを意味し、「レイヤーホスティング」ビューを持っています。この場合、図面をレイヤーに直接描画します。レイヤーの内容がビューの内容になるので、サブビューを追加したり、ビューの描画メカニズムを使用することはできません。

これは、-[NSView setWantsLayer:]文書で言及されています。私はまたそれをかなりよく説明するold cocoa-dev threadを見つけました。

これはあなたの問題を解決するとは確信していませんが、フィルモードの設定やアニメーションが終了した後の値の更新など、他のことはすべて正しく行っています。

+0

情報ありがとうございます。私はそれを設定して、それがうまくいくかどうかを見てみましょう。最終的に正しい方向に私を指して – Ryan

+0

、thx! – thumbsup