1

我正在尝试创建一个自定义NavigationViewController的导航栏,其中导航栏是顶部的可滑动栏,用于控制转换(想想UITabBarController但使用滑动手势而不是按钮)。这是一个快速模型。我为粗鲁道歉

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

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

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

这一切都变得如此复杂......我已经单独完成了这样的事情(快照、自定义 VC 转换等),但在这样的情况下将它们全部组合起来我还不够舒服。我敢肯定,只要有足够的时间,我就能搞定一些方法,但我想了解什么是最好、最干净的方法。

我很感激任何帮助!谢谢。

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

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

4

3 回答 3

1

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

所以如果不出意外,也许你会在那里找到一些灵感/知识。

于 2018-01-18T19:35:21.407 回答
0

您真正需要的是创建自定义 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

于 2018-01-18T19:20:45.177 回答
0

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

于 2018-01-30T23:44:56.257 回答