Пользовательская анимация для размотки segue при отмене нескольких шагов назад - проблемы и что это правильный способ сделать это?

Предположим, что у меня есть 3 UIViewController - A, B и C. Переходы между A < B и B > C выполняются с различными анимированными переходами в обоих направлениях - вперед и назад (анимация размотки segue) подклассификация UIViewControllerTransitioningDelegate и UIViewControllerAnimatedTransitioning. Переходы всего на один шаг вперед или назад работают отлично, но когда я пытаюсь расслабиться больше чем на один шаг назад от C- > A (например, домашняя кнопка) - B отображается без анимации, а затем B- > воспроизводится пользовательская анимация, который выглядит странно. viewWillApper вызывается для всех контроллеров среднего звена в цепочке (в моем примере B). Это почти похоже на расслабление от C- > A делается таким образом - C- > B- > A вместо C- > A (с одной записью - воспроизводится только анимация B- > A, анимация C- > B не играл). То, что я хочу, это просто анимация C- > A (не B- > A), без отображения каких-либо других контроллеров среднего вида или вызова их методов viewWillAppear. Я хочу иметь возможность настраивать анимацию разворачивания segue для C- > A. Как я могу это сделать?

ПРИМЕЧАНИЕ 1. Я не внедряю свои контроллеры в UINavigationController, и я не хочу этого делать, потому что, насколько я знаю (исправьте меня, если я ошибаюсь), он не очень гибкий или, по крайней мере, масштабируемый для разных пользовательских анимаций между различные этапы. Я предпочитаю не использовать его.

ПРИМЕЧАНИЕ 2: Я попытался переопределить

override func segueForUnwindingToViewController(toViewController: UIViewController, fromViewController: UIViewController, identifier: String?) -> UIStoryboardSegue

в A и вернуть пользовательский segue (UIStoryboardSegue производный класс) для разматывания из C- > A. Этот метод был вызван, но анимация запускается, и в середине она переключается на B- > Анимированную анимацию делегата перехода (которую я установил для перехода между B- > A). Так что это тоже не работает.

Что я делаю неправильно? Я почти уверен, что разработчики Apple это поняли и сделали какой-то API или что-то в этом роде. В документации Apple нет ничего о том, как отменить несколько шагов назад с помощью настраиваемой анимации.

И последнее, что нужно сделать, несколько шагов назад работает отлично, просто пользовательская анимация не работает или, по крайней мере, я не могу заставить ее работать.

Любая помощь будет высоко оценена.

Ответы

Ответ 1

Просмотрите следующее видео с WWDC этого года (около отметки 30 минут). Там есть ссылка на образец кода внизу.

https://developer.apple.com/videos/wwdc/2015/?id=215

Возможно, вам придется ждать iOS 9:)

Удачи!

Ответ 2

Я понимаю, что в вашем вопросе вы четко заявили, что не хотите использовать UINavigationController, и я это понимаю. Поэтому нужно принять этот ответ.

Но я бы по-прежнему предлагал использовать UINavigationController в этом сценарии, поскольку он предлагает большую поддержку отслеживания навигации и на самом деле очень гибкий, если расширен, и даже предлагает пользовательские переходы через UINavigationControllerDelegate и UIViewControllerAnimatedTransitioning.

Когда дело доходит до навигации, вы можете вручную манипулировать навигационным стекем, используя .pushToViewController() и .popViewController() или напрямую манипулируя списком контроллеров в .viewControllers или popToRootController().

Я использовал UIKit и UINavigationController в игре, которая нуждалась в довольно тяжелых переходах, и, на мой взгляд, это может потребовать много настроек и по-прежнему предлагает большую помощь в навигации.