UIPercentDrivenInteractiveTransition с CABasicAnimation

При использовании жестового UIPercentDrivenInteractiveTransition с помощью CABasicAnimation (или любого другого CAAnimation) при завершенииInteractiveTransition анимация переходит в конечную позицию, а не анимирует гладко, как это происходит при использовании анимации блока UIView. Я пытаюсь понять, как плавно анимировать endlineInteractiveTransition до конца при использовании CAAnimation.

Я потратил целый день на это. Кажется, что нигде не упоминается использование CAAnimation с пользовательскими переходами VC, все относятся к анимации на основе блоков UIView.

Я создал небольшой примерный проект, который демонстрирует проблему.

https://github.com/stringcode86/UIPercentDrivenInteractiveTransitionWithCABasicAnimation

Спасибо всем, кто проводит время, глядя на него. Я ценю это.

Ответ 1

РЕШЕНИЕ

Как оказалось, решение заключается в том, чтобы манипулировать временем начала слоя. Я попытаюсь объяснить это решение более подробно ниже. Существует два решения, использующих подкласс UIPercentDrivenTransition или реализующий протокол UIViewControllerInteractiveTransitioning. Пользовательский UIViewControllerInteractiveTransitioning находится на главной ветке, а реализация UIPercentDrivenTransition находится в ветке UIPercentDrivenTransitionImplementation.

https://github.com/stringcode86/UIPercentDrivenInteractiveTransitionWithCABasicAnimation

ОБЪЯСНЕНИЕ

UIPercentDrivenTransition использует анимацию в animateTransition: для реализации updateInteractiveTransition:. Я предполагаю, что они просто вызывают animateTransition: из startInteractiveTransition:, а затем устанавливают скорость слоя (возможно, содержимое контейнера) до 0.0 и манипулируют его timeOffSet. Это позволяет им автоматически перемещать ваш переход назад и вперед. Это делает это для ваших анимаций UIView. По какой-то причине проблема с CAAnimations заключается в их свойствах begingTime, timeOffSet, speed. Если вы установите их на разумные значения, вы можете перемещать весь анимированный контент в контейнереView взад и вперед. Я создал SCPercentDrivenTransition вместо альтернативы UIPercentDrivenTransition. Вам нужно только переопределить animateTransition: и вызвать handleGesture: от вызовов действий распознавателя жестов.