Следующий gif демонстрирует проблему с анимацией, которая у меня возникла. Маленький красный вид анимирован. Маленький зеленый вид обозначает начальную позицию. Красный вид анимируется вниз и вправо, а затем автоматически переворачивается. В конце, после возврата в исходное положение, красный вид переходит влево: именно этот прыжок я не понимаю.
Вот код Анимация состоит из двух частей: первоначальное изменение положения Y и изменение положения X, которое выполняется на полпути. Обе анимации автоматически меняются местами. Обратите внимание на закрытие завершения, которое обновляет модель, чтобы отразить окончательную позицию представления, которая была вызвана автоматическим реверсированием. Мне все кажется правильным. Почему прыжок влево?
@objc private func animate() {
let center = animationView.center
let distance: CGFloat = 100
let down = {
UIView.setAnimationRepeatAutoreverses(true)
self.animationView.center.y += distance
}
let right = {
UIView.setAnimationRepeatAutoreverses(true)
self.animationView.center.x += distance
}
let animator = UIViewPropertyAnimator(duration: 2, curve: .linear, animations: down)
animator.addAnimations(right, delayFactor: 0.5)
animator.addCompletion { _ in self.animationView.center = center } // Sync up with result of the autoreverse
animator.startAnimation()
}
- Кажется, что прыжок влево составляет 100 баллов (аналогично анимированному изменению позиции)
- Проблема, похоже, связана с вторая часть анимации. Если я не добавлю его и вместо этого изменю X в первой части (где Y изменен), то все будет хорошо.
- Когда после завершения анимации я проверяю центр красного представления, я нахожу, что это " правильный"; он равен центру root вида. Другими словами: модель и представление не совпадают ???
- Когда я использую возможность иерархии отладки представления XCode, красный вид изображается как находящийся в центре экрана
// *********************************************** ************************
Обновление № 1: анимация состоит из двух частей; вниз и вправо. В каждой из этих двух частей я вызываю UIView.setAnimationRepeatAutoreverse. Если я закомментирую одно или оба из этих автореверсивов, тогда все будет работать как положено (хотя я не получаю эффекта автореверсирования, но поведение кода понятно).
// ** ************************************************** *******************
Обновление № 2: из документации Apple UIView.setAnimationRepeatAutoreverse: использование этого метода не рекомендуется в iOS 4.0 и более поздних версиях , Вместо этого вы должны использовать метод animate (withDuration: delay: options: animations: creation :) для указания ваших анимаций и параметров анимации.
Хорошо. Давайте посмотрим, что еще доступно для выполнения sh задержки второй части анимации.