使用 ContainerViewController,如何在 child 个 ViewController 之间添加交互式动画?

Using a ContainerViewController, how do i add an interactive animation between child ViewControllers?

我正在尝试创建一个自定义 NavigationViewController,其中导航栏是顶部的可滑动栏,用于控制转换(想想 UITabBarController 但使用滑动手势而不是按钮)。 Here is a quick mockup. I apologize for the crudeness

我将 header 栏设置为 ScrollView。我已经能够使用 scrollViewDidScroll 方法成功检测到滚动量。所以我安装了 header 栏部分。我现在需要在 scrollViewDidScroll 方法中实现过渡运动。

我已经查阅了 Apple Documentation 关于如何将视图控制器嵌入彼此的内容,但它并没有真正帮助解释如何做到这一点。文档提到调用 addChildViewController: 方法和一些其他方法,如果我想让 viewControllers 消失并立即重新出现,这些方法很好,但在这种情况下,我发现很难以交互方式进行。

我是否创建当前 VC 的快照然后移动它?但那我到底在移动什么?例如在图片中,我是否将整个 RedVC 移到了左边?但是,如果 BlueVC 开始从框架外移动,我该如何获取它的快照呢?如果我想在 BlueVC 中异步加载图像怎么办?在 BlueVC 捕捉到位之前,我是否必须使用带占位符的占位符快照?

这一切都变得如此复杂...我已经单独完成了类似的事情(快照、自定义 VC 转换等),但我不太愿意将它们全部组合成一个像这样的情况。如果有足够的时间,我确定我可以破解一些方法,但我想学习什么是最好、最干净的方法。

感谢您的帮助!谢谢。

接受@MilanNosáľ 的回答后编辑:

我最终使用了他在 this repo 中链接的框架。它还不是交互式的,但我可以使用他们非常慷慨地为我做的事情来弄清楚其余部分。我希望我可以 post 完整的代码在这里,但这不是很实用。对于未来的 SO 旅行者,回购协议将无限期保留。

您真正需要的是创建自定义 segue 以从当前 VC 移动到目标 VC 并重写执行方法,在此代码片段中,当前 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)
        }

    }

在此处查看更多信息custom-segue-animations

我要无耻地宣传我自己的开源项目,我在其中处理类似的任务 - InteractiveTransitioningContainer。它的目标是准备一个框架来实现自定义容器,允许在其子控制器之间进行交互转换。虽然这可能不是问题的直接答案,但我花了很多时间尝试为子控制器提供与标准容器相同的环境——例如,确保它们的 view(Will|Did)(A|Disa)ppear 回调以正确的顺序调用——我有试验 UINavigationController 以分析其行为等

所以如果没有别的,也许你会在那里找到一些 inspiration/knowledge。

我最初选择米兰的答案作为问题的最终答案。但是,在我过去几周尝试着手研究之后,在他 的大量 帮助下,我们都同意将他的框架集成到可用于此任务的格式中太难了.我现在正在为下面的 ViewControllers 使用 UIScrollView,并让上面的 HeaderView(带有标签的东西)控制下面的 ViewControllers 的滚动视图。