具有持续时间的循环动画,Swift 4

Looping animations with duration, Swift 4

我有一张图片,我想连续移动 10 次。每次我希望它进行检查时,如 checkForStuff 的打印语句所示。我注意到循环开始并在 10 个动作中的第一个动作发生时超时。关于如何链接动画的任何想法,或者我是否需要在顺序闭包中手动编写每个链?

@objc func moveBox(sender: UIButton!) {
    print("Started")
    let imageToMove = UIImageView()
    imageToMove.frame = CGRect(x: 50, y: 50, width: 50, height: 50)
    imageToMove.backgroundColor = .red
    self.view.addSubview(imageToMove)

    var counter = 0
    var altitude = 100


    while counter <= 10 {
        print("looping")
        UIView.animate(withDuration: 0.5, animations: {
            imageToMove.frame = CGRect(x: 50, y: altitude, width: 50, height: 50)
        }, completion: { finished in
            counter += 1
            altitude += 50
            print("Check For Stuff")
        })
    }

}

简而言之,应该向下移动50个像素,执行闭包,再向下移动50个像素。一次又一次。

按照@matt

的建议尝试递归
 func animate(view: UIView, altitude: Int, numberOfTime: Int ) {

        if numberOfTime == 0 { return }

        UIView.animate(withDuration: 0.5, animations: {

            view.frame = CGRect(x: 50, y: altitude, width: 50, height: 50)
        }, completion: { finished in
            self.animate(view: view, altitude: altitude + 50, numberOfTime: numberOfTime - 1)
        })
    }

用作

@objc func moveBox(sender: UIButton!) {
    print("Started")
    let imageToMove = UIImageView()
    imageToMove.frame = CGRect(x: 50, y: 50, width: 50, height: 50)
    imageToMove.backgroundColor = .red
    self.view.addSubview(imageToMove)

    animate(view: imageToMove, altitude: 100, numberOfTime: 10)
}