首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查NSAnimationContext runAnimationGroup是已取消还是已成功

检查NSAnimationContext runAnimationGroup是已取消还是已成功
EN

Stack Overflow用户
提问于 2013-09-13 03:26:41
回答 1查看 1.6K关注 0票数 8

我正在动画一个视图(通过显示它),之后我需要发布一个通知(动画完成后)。无论应用程序的设计方式如何,当视图被隐藏(通过动画)时,会发出另一个通知。所以本质上我有一个'showView‘和一个'hideView’方法。每个人都这样做:

代码语言:javascript
复制
    [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
      [context setDuration: 0.25];

      [[myView animator] setAlphaValue: 0];
    } completionHandler:^{
       // post notification now
    }];

问题是,在后台的另一个线程中,我有一个定期计时器,它执行“健全性检查”,以查看视图是否需要在不需要时隐藏。这是一种积极的方法,但也是必要的,因为应用程序的许多组件都会响应不同的事件和场景。由于这一点,我有时会得到一个‘竞争条件’,用户点击了'showView‘,但同时我们的一个线程认为视图应该立即隐藏。

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

长话短说:我需要能够检查动画成功结束后是否调用了'completionHandler‘,或者它是否被取消了。我知道在iOS中这是可能的,但我在OS X中找不到任何方法来做到这一点。请帮助。

EN

回答 1

Stack Overflow用户

发布于 2018-12-29 05:30:48

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

代码语言:javascript
复制
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
}];

Swift版本:

代码语言:javascript
复制
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
})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18772798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档