2016-07-21 6 views
1

Есть ли способ наблюдать «прогресс времени» в UIView.animateWithDuration ... семейство методов из UIView/альтернативных анимаций CA?Наблюдайте за прогрессом UIView.animateWithDuration/CABasicAnimation?

Я оживляю рамку представления, и мне нужно знать, как она прогрессирует. Моя линия мышления был я могу либо

1) нажмите на связанные CAAnimation вещи или

2) соблюдать анимированные свойства (как кадр) и делать собственные расчеты каждого кадра экрана.

Подход 1) оказывается тупиком, проверяя внутренность того, как работа CAAnimations ничего мне не сказала ... и 2) имеет недостатки, поскольку «дерево моделей модели обновляется немедленно, а нажатие на дерево представления сложный, так как уровень презентации равен нулю при запуске.

Я довольно отчаянный, я думал, что подключение к CADisplayLink даст мне тик, а затем я просто проверю что-то, на что влияет анимация, но нет ничего, что можно было бы нажать на. Как вы думаете, идет ли путь NSTimer, который запускается в той же области, что и метод анимации, в порядке? Если я знаю продолжительность анимации, то я могу сам генерировать прогресс.

+0

Параметр 'CADisplayLink' подход является хорошим. Просто изучите «презентационный слой» анимированного слоя. Пока слой обновляется до конечной позиции, «presentationLayer» содержит свойства слоя в середине полета. – Rob

+0

Можете ли вы привести конкретный пример? – KudoCC

+1

См. Http://stackoverflow.com/a/22727484/1271826 или http://stackoverflow.com/a/21659736/1271826 или http://stackoverflow.com/a/15367737/1271826. Или просто выполните поиск '' presentationLayer'' CADisplayLink'. – Rob

ответ

0

Если все, что вы хотите, это значение времени, то вы можете сделать математику на CACurrentMediaTime() минус время начала анимации. У меня есть пример проекта на Github, который называется KeyframeViewAnimations, который делает именно это.

Этот проект поддерживает приостановку и возобновление и очистку как анимаций UIView, так и CAAnimation. В обоих случаях он копается в базовом CAAnimations.

У меня есть еще один проект, который использует значения слоя представления анимационного слоя для того, чтобы выполнить тестовое тестирование, чтобы вы могли использовать представление в полете и запускать/приостанавливать анимацию. Это можно найти здесь: iOS-CAAnimation-group-demo

В моем коде используется NSTimer, чтобы обновить ход анимации. Как вы упомянули, было бы лучше использовать таймер CADisplayLink.

Я также изучаю новый класс UIViewPropertyAnimator, который был добавлен в iOS 10. Это делает паузу, реверсирование и очистку анимации UIView без необходимости выкапывать в базовый CAAnimations. Смотрите эту тему я просто отвечал:

Is there a way to observe changes to fractionComplete in UIViewPropertyAnimator

Смежные вопросы