Когда добавлять CAAnimation в пользовательский UIVIew?
Проблема: моя пользовательская анимация UIView отображается, только если я добавляю представление в viewWillAppear или позже.
Контекст: в моем пользовательском UIView я создаю и добавляю анимацию к слою в моей пользовательской функции инициализации.
override init(color: UIColor) {
backgroundPulsatingDotView = RouteIndicatorDotView(color: color)
super.init(colour: color)
configureBackgroundPulsatingDot()
addPulsatingAnimation()
}
Этот пользовательский UIView находится глубоко внутри иерархии представления, и в идеале мой контроллер представления не должен заботиться о том, чтобы запускать анимацию самостоятельно или инициировать добавление представления в viewWillAppear только из-за этой анимации [помимо других ошибок, которые появляются при использовании viewWillAppear или более поздних этапов для добавление подпредставлений]
Есть ли способ сохранить логику добавления и запуска анимации в моем собственном представлении, не требуя триггера от внешней стороны, который сказал бы: "Эй, теперь вид виден, пожалуйста, анимируйте себя"?
Или где я должен добавить добавление и запуск анимации в моем жизненном цикле пользовательского представления, чтобы он корректно работал с жизненным циклом контроллера представления?
1 ответ
Есть ли способ сохранить логику добавления и запуска анимации в моем собственном представлении, не требуя триггера от внешней стороны, который сказал бы: "Эй, теперь вид виден, пожалуйста, анимируйте себя"?
Нечего анимировать, пока представление не станет частью иерархии представлений приложения и не было изначально нарисовано. Вы не можете оживить до тех пор. Вот почему вам отправляются события, отмечающие жизненные этапы представления, так что вы можете поместить свой код в правильный метод, который будет запускаться в нужное время в цикле подобного представления. init
это неправильный метод. Это слишком рано.
Попробуйте переопределить другой метод жизни - возможно, что-то вроде layoutSubviews
(хотя будьте осторожны: это можно вызывать много раз, поэтому вам нужно будет использовать флаг Bool, чтобы анимация запускалась только в первый раз).
Также обратите внимание, что даже тогда вы не можете добавить точку и начать анимацию всего одним движением. После добавления вы должны подождать, пока пройдет момент перерисовки, прежде чем начать его анимацию. Что я обычно делаю, так это очень короткая задержка выхода в основной поток, чтобы мой код анимации запускался после того, как текущая транзакция CATransaction была зафиксирована.