2011-07-24 116 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