#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)
}