NSView.animator isAnimating引发错误

时间:2012-11-06 18:14:57

标签: objective-c core-animation nsview

我有一些我正在动画的 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属性,并在动画开始和完成处理程序中设置它,但是这也可能导致一些竞争条件问题。

有人可以帮我查看视图是否正在动画化吗?

1 个答案:

答案 0 :(得分:0)

NSView及其动画制作者都没有属性animating,因此您无法只查询该值。

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

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

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