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



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

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

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

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

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

我感谢任何帮助!谢谢。

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

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

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

因此,如果没有别的,也许您会在那里找到一些灵感/知识。

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

查看更多信息,请点击此处 自定义动画

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

最新更新