Используя 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/

Другие вопросы по тегам