iOS-анимация, UIView При использовании UIView.animate значение frame UIView изменяется постепенно. Для получения текущего фрейма используйте presentation layer объекта CALayer presentationLayer в реальном времени хранит текущие значения свойств, которые сейчас анимируются например, выражение view.layer.presentation()?.frame возвращает фактический фрейм объекта в процессе анимации в основном слое (model layer) сохраняется только итоговое значение это необходимо для синхронизации логики с визуальным состоянием анимации
Как получить текущий frame UIView в процессе анимации?
iOS-анимация, UIView При использовании UIView.animate значение frame UIView изменяется постепенно. Для получения текущего фрейма используйте presentation layer объекта CALayer presentationLayer в реальном времени…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Как получить текущий frame UIView в процессе анимации?
- iOS-анимация, UIView
- При использовании UIView.animate значение frame UIView изменяется постепенно.
- Для получения текущего фрейма используйте presentation layer объекта CALayer
- presentationLayer в реальном времени хранит текущие значения свойств, которые сейчас анимируются
- например, выражение
view.layer.presentation()?.frameвозвращает фактический фрейм объекта в процессе анимации - в основном слое (
model layer) сохраняется только итоговое значение - это необходимо для синхронизации логики с визуальным состоянием анимации
Итог: presentation layer — источник текущего фрейма UIView в процессе анимации.
Развёрнутый ответ
Ключевой ответ
Во время анимации в iOS актуальный фрейм-вьюху (frame of a view) можно определить через свойство presentationLayer соответствующего слоя CALayer. В presentationLayer находится визуальное состояние слоя, отображаемое в данный момент, а modelLayer хранит значения свойств, которые будут установлены после завершения анимации. Поэтому для получения текущих координат и размеров вью следует использовать view.layer.presentationLayer()?.frame.
Основные моменты
- presentationLayer представляет собой копию слоя с его текущим отображаемым состоянием. Она обновляется на каждом цикле рендеринга и показывает progress анимации.
- Во время выполнения анимации значение
view.frameилиview.layer.frameне меняется немедленно: оно обновляется лишь после завершения анимации. Поэтому эти свойства не подходят для получения актуальных значений. - Обращаться к
presentationLayerследует только из главного потока и тогда, когда анимация уже запущена; в противном случае значение может оказатьсяnil.
Где это применяется на практике
К примеру, при определении положения вьюхи во время скролла с кастомной анимацией или контроле коллизий в движущемся UI удобно использовать presentationLayer.frame. Это стандартный подход для UIKit и Core Animation, доступный начиная с iOS 8+. В прикладных проектах его часто применяют для анимации draggable объектов, когда важно в каждый момент точно определить фактическое положение элемента на экране, а не его конечную позицию.