2011-07-24 85 views
2

看來好像我的NSView的圖層屬性有時不可編輯/錯誤。在下面的代碼中,動畫完美運行,並且都顯得很正常。從NSlogs輸出總是:NSView CALayer不透明度瘋狂

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

前兩個日誌看起來不太好,即使在動畫沒有停止,該層似乎正常運行。然而,一段時間後,當我檢查不透明度時,它奇蹟般地變爲0.另外錯誤的是,當我將圖層的不透明度設置爲1時,立即檢查它,它仍然是0.這怎麼可能?

我在圖層中設置了setneedsdisplay,並在nsview中設置了需要顯示: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