Когда добавлять 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 была зафиксирована.

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