0

我有一些正在制作动画的NSView子类(更改帧和 alpha 值)。有时我需要停止动画,但是我不断收到错误

这是一个代码:

[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:1.5f];
[textView.animator setFrame:frame];
[textView.animator setAlphaValue:0.0];
[NSAnimationContext endGrouping];

if ([textView.animator isAnimating]) { // Here the exception is raised
    NSLog(@"%@ is animating!", textView);
}

我想打电话[textView.animator isAnimating],但这只是给了我

Exception detected while handling key input.
*** -[NSProxy doesNotRecognizeSelector:isAnimating] called!

带有代码的示例项目位于https://bitbucket.org/lukaszb/animationartifacts/src/0dc41660f26dd3b629c28bbbda6eb647

我可能会isAnimating在我的子类中添加一些属性NSView并在动画开始和完成处理程序中设置它,但是我想这也可能导致一些竞争条件问题。

谁能帮助我如何检测视图是否正在动画?

4

1 回答 1

0

动画师和动画师都NSView没有 property animating,所以你不能只查询那个值。

但是,正如您所建议的,您可以为此目的定义自己的属性。诀窍是在动画完成后将其设置回NO,您可以使用completionHandler当前动画上下文的属性来执行此操作:

[NSAnimationContext beginGrouping];
[NSAnimationContext currentContext].completionHandler = ^{ self.animating = NO; };
// ... set up your animation ...
[NSAnimationContext endGrouping];

请注意,该块是在主线程上调用的(如文档中所示),因此只要您始终animating在主线程上设置属性,它将确保状态一致。由于您正在处理 UI 代码,因此可能就是这种情况。

于 2013-01-23T08:55:49.663 回答