У меня есть изображение, которое я хочу переместить 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 пикселей вниз. и снова, и снова.
Настроить все анимации с ключевыми кадрами? В вашем случае это должно быть довольно просто и устраняет необходимость рекурсии.
Попробуйте рекурсию, предложенную @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)
}
Используйте рекурсию, а не цикл while.