Новый класс UIViewPropertyAnimator имеет свойство дробьComplete. Оно варьируется от 0,0 (начало анимации) до 1,0 (конец анимации). Если вы измените значение, вы сможете «прочистить» анимацию от начала до конца.
У меня есть демонстрационный проект на Github под названием KeyframeViewAnimations, который позволяет вам использовать ползунок для перемещения UIView и CAAnimations вперед и назад, используя довольно загадочные приемы CAAnimation. Во время выполнения анимации ползунок перемещается от начала до конца, показывая ход анимации. Этот проект был написан на Objective-C до выпуска Swift, но базовые методы в Objective-C и Swift одинаковы.
Я решил создать эквивалентный проект, используя UIViewPropertyAnimator. Есть некоторые особенности, но все довольно просто. Одна вещь, которую я не мог понять, как сделать чисто, — это наблюдать за ходом изменения свойстваfractionComplete анимации, чтобы я мог обновлять ползунок по мере продвижения анимации. Я попытался настроить KVO (наблюдение за значением ключа) для свойстваfractionComplete, но оно не вызывает уведомление KVO до завершения анимации.
В итоге я установил таймер, который работает с очень небольшим интервалом и неоднократно запрашивает свойство FractionComplete UIViewPropertyAnimator и обновляет ползунок по мере его выполнения. Это работает, но это не очень чистый способ ведения дел. Было бы намного лучше, если бы был способ получать уведомления о ходе анимации.
Надеюсь, я что-то упускаю.
Вы можете увидеть проект на основе UIViewPropertyAnimator на Github по этой ссылке: UIViewPropertyAnimator-test.
Код, который получает значение прогресса от аниматора:
Код: Выделить всё
func startTimer(_ start: Bool) {
if start {
timer = Timer.scheduledTimer(withTimeInterval: 0.02,
repeats: true) {
timer in
var value = Float(self.viewAnimator.fractionComplete)
if self.animatingBackwards {
value = 1 - value
}
self.animationSlider.value = value
}
}
else {
self.timer?.invalidate()
}
}
Подробнее здесь: https://stackoverflow.com/questions/410 ... tyanimator