кажется, что дьявол находится в самом вашем animateArrow()
методе, если вы немного измените метод, например, например. это:
private func animateArrow() {
self.layoutIfNeeded()
self.arrowLeadingConstraint.constant = 31 // = 15 + 16 from your original code
UIView.animate(withDuration: 0.3, delay: 0, options: [.curveEaseOut, .autoreverse, .repeat], animations: {
self.layoutIfNeeded()
}, completion: nil)
}
Тада , анимация будет работать должным образом, как вы ожидали.
почему ...?
Мое объяснение здесь может быть не академическим, но я надеюсь, что оно поможет читателям лучше понять.
Итак, вкратце, когда вы имеете дело с ограничениями, вы неявно имеете дело с набором предопределенных отношений между представлением и его окружением . вот почему вы не можете успешно анимировать отдельное ограничение (ваша первоначальная попытка), потому что только эти отношения являются анимируемыми в этом контексте, а не ограничения.
поэтому вы сможете анимировать обновление всех отношений только после вы определили новые ограничения для вашего макета - и в принципе за кулисами, которые могут привести анимировать кадр каждого затронутого вида за один раз.
вы можете прочитать больше о том, что такое ограничения и как оценка работает с Auto-Layout от Apple , если вы заинтересованы в этом.