【问题标题】:Check if NSAnimationContext runAnimationGroup cancelled or succeeded检查 NSAnimationContext runAnimationGroup 是取消还是成功
【发布时间】:2013-09-12 19:26:41
【问题描述】:

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

    [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
      [context setDuration: 0.25];

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

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

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

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

【问题讨论】:

    标签: objective-c cocoa core-animation nsanimationcontext


    【解决方案1】:

    我遇到了类似的问题。我通过使用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
    }];
    

    Swift 版本:

    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
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多