1

在我的 Mac OS X 应用程序中,我正在尝试使用以下代码为 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