Используя ContainerViewController, как добавить интерактивную анимацию между дочерними ViewControllers?
Я пытаюсь создать индивидуальный NavigationViewController
где панель навигации - это прокручиваемая панель вверху, которая контролирует переходы UITabBarController
но жестами смахивания не кнопки). Вот быстрый макет. Прошу прощения за грубость
У меня есть панель заголовка, настроенная как ScrollView. Я смог успешно определить количество прокрутки, используя scrollViewDidScroll
метод. Так что у меня есть часть заголовка бара. Теперь мне нужно реализовать переходное движение в scrollViewDidScroll
метод.
Я посмотрел документацию Apple о том, как встроить контроллеры представления друг в друга, но это не помогло объяснить, как это сделать. В документации упоминается призыв addChildViewController:
method и множество других методов, которые хороши, если я хочу, чтобы viewControllers исчезали и появлялись мгновенно, но в этом сценарии мне трудно сделать это интерактивно.
Создать снимок текущего VC, а затем переместить его? Но тогда что именно я двигаюсь? Например, на картинке я перемещаю весь RedVC влево? Но тогда как я могу получить снимок BlueVC, если он начинает двигаться снаружи кадра? Что если я хочу загрузить изображения в асинхронном режиме в BlueVC? Должен ли я использовать снимок заполнителя с заполнителями, пока BlueVC не защелкнется на месте?
Все это становится настолько запутанным... Я делал такие вещи по отдельности (снимки, пользовательские переходы VC и т. Д.), Но мне не очень удобно комбинировать их все в подобном случае. Я уверен, что смогу взломать каким-то образом, если у меня будет достаточно времени, но я хочу узнать, что является лучшим, самым чистым способом.
Я ценю любую помощь! Благодарю.
Изменить после принятия ответа @MilanNosáľ:
Я закончил тем, что использовал его фреймворк, связанный с этим репо. Это еще не интерактивно, но я могу выяснить остальное, используя то, что они очень любезно сделали для меня. Я хотел бы выложить здесь полный код, но это не очень практично. Репо останется на неопределенный срок для будущих путешественников ТАК.
3 ответа
Первоначально я выбрал ответ Милана в качестве окончательного ответа на вопрос. Но после того, как я пытался работать над этим в течение последних нескольких недель, с его большой помощью, мы оба согласились, что было слишком сложно интегрировать его фреймворк в формат, пригодный для этой задачи. Сейчас я работаю над использованием UIScrollView
для ViewControllers ниже, и пусть HeaderView
выше (вещь с метками) управляет прокруткой ViewControllers ниже.
Я буду бесстыдно рекламировать свой собственный проект с открытым исходным кодом, в котором я занимаюсь аналогичными задачами - http://github.com/MilanNosal/InteractiveTransitioningContainer. Его целью было подготовить структуру для реализации пользовательских контейнеров, которые позволяют интерактивные переходы между дочерними контроллерами. Хотя это может и не быть прямым ответом на вопрос, я потратил много часов, пытаясь обеспечить ту же среду для дочерних контроллеров, что и стандартные контейнеры, например, убедиться, что их view(Will|Did)(A|Disa)ppear
обратные вызовы вызываются в правильном порядке - мне пришлось поэкспериментировать с UINavigationController
проанализировать его поведение и т. д.
Так что, если ничего другого, может быть, вы найдете там вдохновение / знания.
Что вам действительно нужно, так это создать пользовательский переход для перехода от текущего VC к VC-получателю и переопределить метод execute таким образом, в этом фрагменте кода текущий VC перемещается вверх, а пункт назначения анимируется снизу вверх, не стесняйтесь изменять любым способом
override func perform() {
// Assign the source and destination views to local variables.
var firstVCView = self.sourceViewController.view as UIView!
var secondVCView = self.destinationViewController.view as UIView!
// Get the screen width and height.
let screenWidth = UIScreen.mainScreen().bounds.size.width
let screenHeight = UIScreen.mainScreen().bounds.size.height
// Specify the initial position of the destination view.
secondVCView.frame = CGRectMake(0.0, screenHeight, screenWidth, screenHeight)
// Access the app's key window and insert the destination view above the current (source) one.
let window = UIApplication.sharedApplication().keyWindow
window?.insertSubview(secondVCView, aboveSubview: firstVCView)
// Animate the transition.
UIView.animateWithDuration(0.4, animations: { () -> Void in
firstVCView.frame = CGRectOffset(firstVCView.frame, 0.0, -screenHeight)
secondVCView.frame = CGRectOffset(secondVCView.frame, 0.0, -screenHeight)
}) { (Finished) -> Void in
self.sourceViewController.presentViewController(self.destinationViewController as UIViewController,
animated: false,
completion: nil)
}
}
увидеть больше информации здесь https://www.appcoda.com/custom-segue-animations/