Циклическая анимация с длительностью, Swift 4

#swift #loops #animation #race-condition

#swift #циклы #Анимация #состояние гонки

Вопрос:

У меня есть изображение, которое я хочу переместить 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")
        })
    }

}
  

Короче говоря, in должен переместиться на 50 пикселей вниз, выполнить закрытие, снова переместить на 50 пикселей вниз. и снова, и снова.

Комментарии:

1. Используйте рекурсию, а не цикл while.

2. Настроить все анимации с ключевыми кадрами? В вашем случае это должно быть довольно просто и устраняет необходимость в рекурсии.

Ответ №1:

Попробуйте рекурсию, как предложил @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)
}