当应用程序进入后台时暂停和恢复 UIView 动画

Posted

技术标签:

【中文标题】当应用程序进入后台时暂停和恢复 UIView 动画【英文标题】:Pause and Resume UIViewAnimation when app goes to background 【发布时间】:2015-08-16 07:45:43 【问题描述】:

我正在为视图设置动画,我想暂停并恢复它。

使用苹果指南我创建了一个 CALayer 扩展

extension CALayer 

    func pause() 
        var pauseTime = self.convertTime(CACurrentMediaTime(), fromLayer: nil)
        self.speed = 0.0
        self.timeOffset = pauseTime
    

    func resume() 
        var pausedTime = self.timeOffset
        self.speed = 1.0
        self.timeOffset = 0.0
        self.beginTime = 0.0
        var timeSincePause = self.convertTime(CACurrentMediaTime(), toLayer: nil) - pausedTime

        self.beginTime = timeSincePause
    

此代码运行良好,除非该应用程序进入后台。当我将应用程序带回前台时,动画完成(即使时间没有过去),当我点击恢复时它没有再次启动。

好的。我尝试为 CALayer 设置动画,但我遇到了同样的问题。

extension CALayer 

   func animateY(newY:CGFloat,time:NSTimeInterval,completion:()->Void)
    CATransaction.begin()
    CATransaction.setCompletionBlock(completion)
    let animation = CABasicAnimation(keyPath: "position.y")
    animation.fromValue = self.position.y
    animation.toValue  = newY
    animation.duration = time
    animation.delegate = self
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
    animation.removedOnCompletion = false // don't remove after finishing
    self.position.y = newY
    self.addAnimation(animation, forKey: "position.y")
    CATransaction.flush()

  

【问题讨论】:

您是否尝试过为您的动画设置removedOnCompletion=NO;。这应该会阻止它被删除。 您还可以为通知事件UIApplicationDidBecomeActiveNotification 添加一个观察者,您可以在其中重新调整您的动画。您可以将其视为viewWillAppear,因为它不会在后台恢复时调用。 在这方面有很多重复的问题,包括“在应用程序从后台恢复时恢复动画停止的地方”的答案。见***.com/questions/7568567/… 您没有注意到我尝试了答案中的方法并且对我不起作用。 :) 【参考方案1】:

我建议使用CABasicAnimation。您的恢复/暂停方法应该没问题,因为它们来自 answer. 您应该尝试使用 Core Animation 而不是 UIViewAnimation,然后恢复/暂停将起作用。

然后您可以注册两个通知UIApplicationWillEnterForegroundNotificationUIApplicationDidEnterBackgroundNotification 以完全控制暂停/恢复操作。

【讨论】:

那是和问题代码一样的代码,只是没有实现为CALayer扩展。 是的,但他使用的是 UIViewAnimation 而不是 Core Animation。这就是为什么我认为他的代码没有效果,因为它应该与图层动画一起使用。

以上是关于当应用程序进入后台时暂停和恢复 UIView 动画的主要内容,如果未能解决你的问题,请参考以下文章

如何暂停和恢复 UIView 动画(没有块动画)?

呈现另一个 UIViewController 时 UIView 动画暂停

如何暂停和恢复 UIView.animateWithDuration

当应用程序进入暂停状态时取消本地通知。(从后台删除)

当视图消失时,UIView动画停止,重新出现时不再恢复

当 iOS 应用程序进入后台时,是不是会暂停冗长的任务?