检查 NSAnimationContext runAnimationGroup 是否已取消或成功



我正在为视图设置动画(通过显示它),之后我需要发布通知(动画完成后)。然而,应用的设计方式是,当视图被隐藏(通过动画)时,会发送另一个通知。所以基本上我有一个"显示视图"和一个"隐藏视图"方法。每个都执行以下操作:

    [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
      [context setDuration: 0.25];
      [[myView animator] setAlphaValue: 0];
    } completionHandler:^{
       // post notification now
    }];

问题是在后台的另一个线程中,我有一个定期计时器,它执行"健全性检查"以查看视图是否需要隐藏(如果不需要)。这是一种激进的方法,但很有必要,因为应用的许多组件都会响应不同的事件和方案。因此,我有时会得到一个"竞争条件",用户点击了"showView",但与此同时,我们的一个线程认为应该立即隐藏视图。

当两者都在主线程上发布通知时,应用程序将无限期地挂起在旋转锁中。如果我能够弄清楚上面的动画块是否被"取消"(即在同一视图上执行的另一个动画块),我可以完全避免这种情况。在这种情况下,我不会发布通知,这样就不会强制检查。

长话短说:我需要能够检查动画成功结束后是否调用了"完成处理程序",或者它是否已被取消。我知道在iOS中这是可能的,但我在OS X中找不到任何方法。

我遇到了类似的问题。我通过使用currentAnimationUUID实例变量解决了它。

NSUUID *animationUUID = [[NSUUID alloc] init];
self.currentAnimationUUID = animationUUID;
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
    // set properties to animate
} completionHandler:^{
    BOOL isCancelled = ![self.currentAnimationUUID isEqual:animationUUID];
    if (isCancelled) {
        return;
    }
    self.currentAnimationUUID = nil;
    // do stuff
}];

迅捷版本:

let animationUUID = UUID()
currentAnimationUUID = animationUUID
NSAnimationContext.runAnimationGroup({ context in
    // set properties to animate
}, completionHandler: {
    let isCancelled = self.currentAnimationUUID != animationUUID
    guard !isCancelled else {
        return
    }
    self.currentAnimationUUID = nil
    // do stuff
})

相关内容

  • 没有找到相关文章

最新更新