UIView анимация с блоком завершения не работает
У меня есть следующая небольшая функция, которая содержит два основных действия, которые я хотел бы выполнить. Трехсекундная анимация, а затем по завершении этой анимации вызов другой функции. Однако происходит то, что строка кода, которая вызывает другую функцию, выполняется до завершения анимации UIView.
func switchToNormalState() {
print("Switching to Normal State")
currentState = "normal"
intervalCounter = intervalCounter + 1
setVisualsForState()
UIView.animateWithDuration(Double(normalDuration), animations: { () -> Void in
self.ProgressBar.setProgress(1.0, animated: true)
}, completion: { _ in
self.switchToFastState()
})
}
Я изучал другие подобные посты в поисках решения, но ни одно из решений не решило мою загадку. Что я делаю не так в блоке завершения, чтобы эти действия были последовательными, а не одновременными?
2 ответа
При условии, что ProgressBar
это UIProgressView
, setProgress
Метод оживляет себя и не должен содержаться в UIView.animateWithDuration
вызов.
Это означает, что setProgress
анимация, вероятно, дольше, чем продолжительность, которую вы кладете в UIView.animateWithDuration
позвони, так self.switchToFastState()
вызывается, когда UIView
анимация заканчивается - до setProgress
анимация завершена.
Решения
Измените продолжительность. Вы можете взломать это, найдя / угадав продолжительность
setProgress
анимация и использование этого в качестве вашегоUIView
продолжительность анимации. Это должно имитировать поведение, к которому вы идете.Измените продолжительность, но используйте GCD. Это та же идея, что и выше, но она не использует
UIView
метод анимации. Вы можете увидеть этот вопрос о том, как использовать GCD.NSTimer или Подклассы. Здесь есть решения, которые используют
NSTimer
или подклассUIProgressView
,
Я не уверен, что это лучшее решение, но вот чем я закончил:
ProgressBar.progress = 1.0
UIView.animateWithDuration(Double(normalDuration), animations: { () -> Void in
self.ProgressBar.layoutIfNeeded()
}, completion: { (_) -> Void in
self.switchToFastState()
})
Это решение удаляет setProgress (который может быть анимированным) из блока анимации, и это позволяет выполнять анимацию UIView без прерывания.