Как отладить (debug) приложение в середине выполнения анимации в iOS?

Ответ

Да, это возможно с помощью инструментов Xcode.

1. Debug View Hierarchy (Визуальная инспекция): Нажмите Cmd + Shift + D во время выполнения анимации. Этот инструмент "заморозит" интерфейс и покажет иерархию представлений в их текущем, промежуточном состоянии.

2. Использование LLDB для доступа к слою презентации: Во время паузы на точке останова (breakpoint) можно запросить у Core Animation текущие кадры анимации.

  • Каждое анимируемое свойство (frame, opacity, transform) имеет два слоя:

    • model layer — конечное значение анимации.
    • presentation layer — текущее значение на экране.

    Команды в консоли LLDB:

    // Получить текущий frame анимируемого view
    (lldb) po myView.layer.presentation()?.frame
    
    // Проверить, анимируется ли свойство прямо сейчас
    (lldb) po myView.layer.animationKeys()

3. Практический пример в коде:

   UIView.animate(withDuration: 2.0) {
       myView.center.y += 200
   }
   // Установите точку останова здесь и через 1 секунду выполните в LLDB:
   // (lldb) po myView.layer.presentation()?.frame
   // Вы увидите промежуточное значение Y (например, ~100).

4. Отладка через кнопку паузы (Pause): Просто нажмите кнопку Pause в дебаггере Xcode во время анимации — выполнение прервется, и вы сможете исследовать состояние.

Ответ 18+ 🔞

А, ну это же классика, блядь! Сидишь, смотришь, как твой вьюхер по экрану ползёт, и думаешь: «А где он, сука, сейчас находится? В какой конкретно точке между точкой А и точкой Б?». Чувство, будто пытаешься поймать муху голыми руками, ёпта.

Так вот, слушай сюда, это решается проще, чем кажется, но с парой трюков, от которых мозг может слегка ебнуться.

1. Debug View Hierarchy — наш спасительный «стоп-кадр». Ты просто во время анимации жмёшь Cmd + Shift + D. Весь интерфейс, сука, замирает, как вкопанный. Xcode вываливает тебе всю иерархию вьюх в том самом состоянии, в котором они были в момент нажатия. Это как поставить жизнь на паузу и начать ковыряться в кишках. Охуенно удобно.

2. LLDB и его волшебный presentation layer. Вот тут начинается магия, блядь. У Core Animation для каждого анимируемого свойства есть две сущности: model layer (это конечная цель, куда всё должно приехать) и presentation layer (это его текущее, прямо сейчас на экране, промежуточное состояние, пока он едет). Ставишь брейкпоинт прямо в середине анимации, паузишься и в консоли пишешь:

(lldb) po myBeautifulView.layer.presentation()?.frame

И он тебе, сука, выплюнет текущие координаты! Не те, которые будут, а те, которые есть прямо сейчас. Можно ещё спросить:

(lldb) po myBeautifulView.layer.animationKeys()

Чтобы понять, анимируется ли оно вообще или просто стоит, как пень.

3. Пример из жизни, чтобы не быть голословным.

UIView.animate(withDuration: 2.0) {
    myView.center.y += 200 // Поехали вниз на 200 пунктов за 2 секунды
}
// Ставишь сюда брейкпоинт, ждёшь секундочку, паузишь.
// И в консоли LLDB:
// (lldb) po myView.layer.presentation()?.frame
// Увидишь что-то вроде (50.0, 100.0, 100.0, 100.0) — это он на полпути!

4. Просто кнопка «Пауза». Да не заморачивайся ты иногда! Жми на эту самую большую кнопку паузы в дебаггере, пока анимация идёт. Всё встанет. И ты можешь спокойно в инспекторе переменных смотреть, что с твоими вьюхами происходит. Иногда проще не бывает, в рот меня чих-пых.

В общем, не надо гадать на кофейной гуще. Xcode даёт тебе все инструменты, чтобы залезть анимации под капот и посмотреть, что там творится в любой момент. Главное — знать, куда тыкать.