如何暂停和恢复UIView.animateWithDuration

Sim*_*rek 11 uiview ios swift

我有一个图像,我使用此代码为viewDidAppear设置动画:

UIView.animateWithDuration(10.5, delay:0.0, options: [], animations:{
self.myImage.transform = CGAffineTransformMakeTranslation(0.0, 200)
}, completion: nil)
Run Code Online (Sandbox Code Playgroud)

我想点击时暂停动画myPauseButton,如果我再次点击它,则恢复动画.

t4n*_*hpt 27

暂停和恢复动画的2个功能,我从这里开始转换为Swift.

func pauseLayer(layer: CALayer) {
    let pausedTime: CFTimeInterval = layer.convertTime(CACurrentMediaTime(), from: nil)
    layer.speed = 0.0
    layer.timeOffset = pausedTime
}

func resumeLayer(layer: CALayer) {
    let pausedTime: CFTimeInterval = layer.timeOffset
    layer.speed = 1.0
    layer.timeOffset = 0.0
    layer.beginTime = 0.0
    let timeSincePause: CFTimeInterval = layer.convertTime(CACurrentMediaTime(), from: nil) - pausedTime
    layer.beginTime = timeSincePause
}
Run Code Online (Sandbox Code Playgroud)

我有一个按钮来暂停或恢复动画,其中包含以下内容viewDidLoad:

var pause = false
override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    UIView.animate(withDuration: 10.5) {
        self.image.transform = CGAffineTransformMakeTranslation(0.0, 200)
    }
}

@IBAction func changeState() {
    let layer = image.layer
    pause = !pause
    if pause {
        pauseLayer(layer)
    } else {
        resumeLayer(layer)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 简单,优雅,完美,谢谢! (2认同)
  • 谢谢,这对我帮助很大!但是,当图层暂停并旋转视图时,应用程序会挂起。我怎样才能防止这种情况? (2认同)
  • 我登录只是为了感谢您并投票!UIViewProbertyAnimator 太愚蠢了,谢谢你 (2认同)

Grz*_*ski 9

这是答案的Swift 3版本+我将这些功能移到了扩展名

extension CALayer {
    func pause() {
        let pausedTime: CFTimeInterval = self.convertTime(CACurrentMediaTime(), from: nil)
        self.speed = 0.0
        self.timeOffset = pausedTime
    }

    func resume() {
        let pausedTime: CFTimeInterval = self.timeOffset
        self.speed = 1.0
        self.timeOffset = 0.0
        self.beginTime = 0.0
        let timeSincePause: CFTimeInterval = self.convertTime(CACurrentMediaTime(), from: nil) - pausedTime
        self.beginTime = timeSincePause
    }
}
Run Code Online (Sandbox Code Playgroud)


Rom*_*mov 6

由于iOS 10提供了UIViewPropertyAnimator您可以轻松解决问题的方法。

在您的控制器中创建以下属性:

var animationPaused = false
lazy var animator: UIViewPropertyAnimator = UIViewPropertyAnimator(duration: 10.5, curve: .easeInOut, animations: {

    self.myImage.transform = CGAffineTransform(translationX: 0.0, y: 200)
})
Run Code Online (Sandbox Code Playgroud)

将以下代码添加到的点击处理程序中myPauseButton

if self.animator.state == .active { // Don't start or pause animation when it finished

    self.animationPaused = !self.animationPaused
    self.animationPaused ? self.animator.pauseAnimation() : self.animator.startAnimation()
}
Run Code Online (Sandbox Code Playgroud)

viewDidAppear(_ animated: Bool)以下代码行开始动画:

self.animationPaused = false
self.animator.startAnimation()
Run Code Online (Sandbox Code Playgroud)