一个接一个的animateWithDuration

animateWithDuration one after another

我有一个最初位于屏幕中央的标签。它目前从屏幕的中心过渡到屏幕的右端,然后自动返回到它的位置。我想让它开始另一个 animateWithDuration,以便它从中心 return 继续到屏幕的左侧位置,然后自动返回到该位置,然后从那里依次循环。

我已经尝试并成功完成了前半部分,但我不确定如何继续到第二部分,它开始了中心-> 左过渡和循环。

Swift 2.0代码:

   func animateRight()
    {
        UIView.animateWithDuration(1.0, delay: 0.0, options: [ .Autoreverse, .CurveEaseInOut], animations: {
                label.center.x = self.view.frame.width/2
            }, completion: { finished in
                if finished {
                    label.frame.origin.x = 0.0
                    animateLeft()
                }
        })
    }

    func animateLeft()
    {
        UIView.animateWithDuration(1.0, delay: 0.0, options: [ .Autoreverse, .CurveEaseInOut], animations: {
                label.frame.origin.x = (self.view.frame.width/2) * -1
            }, completion: { finished in
                if finished {
                    label.center.x = self.view.frame.width/2
                    animateRight()
                }
        })
    }

    // Start process
    animateRight()

您应该使用您创建的动画持续时间方法调用相同的动画,以便向右动画并在完成时调用。像这样:

func animateRight()
{
    UIView.animate(withDuration: 1.0, delay: 0.0, options: [], animations: {
        self.label.center.x = self.view.frame.width
    }, completion: { finished in
        if finished {
            self.animateLeft()
        }
    })
}

func animateLeft()
{
    UIView.animate(withDuration: 2.0, delay: 0.0, options: [ .autoreverse, .repeat, .curveEaseInOut, .beginFromCurrentState], animations: {
        self.label.frame.origin.x = 0.0
    }, completion: nil)
}
  • 调用defaultSetup开始
  • animationRight结束时,会调用animationLeft
  • animationLeft结束时,会再次调用animationRight到运行动画循环

代码如下:

    func defaultSetup(){
        
        self.animationRight()
    }
    
    func animationRight(){
        
        let transform = CGAffineTransform(scaleX: 1.05, y: 1.05).rotated(by: .pi/180)
        UIView.animate(withDuration: 3.0, delay: 0, usingSpringWithDamping: 0.2, initialSpringVelocity: 3.0, options: [.allowUserInteraction, .repeat], animations: { [weak self] in
            guard let `self` = self else { return }
            self.vRight.transform = transform
            
        }, completion: { [weak self] (done) in
            guard let `self` = self else { return }
            self.vRight.transform = .identity
            self.animationLeft()
        })
    }
    
    func animationLeft(){
        let transform = CGAffineTransform(scaleX: 1.05, y: 1.05).rotated(by: .pi/180)
        UIView.animate(withDuration: 3.0, delay: 0, usingSpringWithDamping: 0.2, initialSpringVelocity: 3.0, options: [.allowUserInteraction], animations: { [weak self] in
            guard let `self` = self else { return }
            self.vLeft.transform = transform
            
        }, completion: { [weak self] (done) in
            guard let `self` = self else { return }
            self.vLeft.transform = .identity
            self.animationRight()
        })
    }