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 анимация завершена.

Решения

  1. Измените продолжительность. Вы можете взломать это, найдя / угадав продолжительность setProgress анимация и использование этого в качестве вашего UIView продолжительность анимации. Это должно имитировать поведение, к которому вы идете.

  2. Измените продолжительность, но используйте GCD. Это та же идея, что и выше, но она не использует UIView метод анимации. Вы можете увидеть этот вопрос о том, как использовать GCD.

  3. NSTimer или Подклассы. Здесь есть решения, которые используют NSTimer или подкласс UIProgressView,

Я не уверен, что это лучшее решение, но вот чем я закончил:

        ProgressBar.progress = 1.0
        UIView.animateWithDuration(Double(normalDuration), animations: { () -> Void in
            self.ProgressBar.layoutIfNeeded()
            }, completion: { (_) -> Void in
                self.switchToFastState()
        })

Это решение удаляет setProgress (который может быть анимированным) из блока анимации, и это позволяет выполнять анимацию UIView без прерывания.

Другие вопросы по тегам