iOS7 Facebook NavigationBar行为

我的应用程序与Facebook的/ Instagram的iOS7应用程序具有或多或少相同的导航概念:

一个带有5个选项卡的ContainerViewController,每个选项卡都有一个NavigationController,因为它是rootViewController。

我现在正试图为第一个标签的navigationController的rootViewController重现Facebook的navigationBar行为( – >第一个’真正的’VC,而不仅仅是像NavVC这样的容器)。

我能够使用UIScrollView Delegate方法实现隐藏/显示navigationBar(scrollViewDidScroll:,scrollViewWillBeginDragging:,scrollViewDidEndDragging 🙂

注意:navigationBar的frame.origin.y手动偏移到顶部。 我没用

[self.navigationController setNavigationBarHidden:] 

到目前为止它真的很顺利。 但我面临两个问题,我想不出解决方案:

当我将新的ViewController推送到第一个选项卡的导航堆栈时,navigationBar保持隐藏状态。

为了解决这个问题,我在推送的ViewController的viewWillAppear:方法中执行此操作:

  CGRect navBarFrame = self.navigationController.navigationBar.frame; navBarFrame.origin.y = 20.0; [UIView animateWithDuration:0.3 animations:^{ [self.navigationController.navigationBar setFrame:navBarFrame]; }]; 

此动画与iOS的navigationController推送动画正确匹配。

问题:当我向后导航(弹出推送的VC)时,navigationBar保持可见。

我能够通过在两个ViewControllers上创建和设置一些属性来解决这个问题,但它是一个巨大的混乱,它将变得更加hacky,因为我将不得不将3或4个不同的ViewController类型推送到此导航堆栈。

我的问题(最后-.-):

如何实现类似Facebook的推/弹行为?

'旧'ViewController的navigationBar保持隐藏,而推送的VC似乎有它的?自己的导航栏?

这是我正在寻找的行为:一个干净的过渡,其中’旧’navigationBar保持隐藏状态,并显示推送的viewController的栏。

注意:屏幕截图是在新的’从左到右滑动’回到’iOS7手势’期间拍摄的。

第二个问题:有没有办法实现一个全局处理程序,以便在任何viewController中创建这种行为,而不必在每一个中实现scrollDelegate逻辑? 我正在考虑一个符合UIScrollView Delegate的委托对象。

谢谢你的帮助 :)

长话短说:我为此建立了自己的自定义容器。 它提供了在选项卡之间切换的function,以及在每个选项卡上推送新的ViewControllers。 有点像UINavigationController和UITabBarController之间的混合。

如果您需要更详细的答案,请告诉我。

我写了一个自定义滑动动画转换UINavigationController的子类。 它的行为类似于Facebook / Instagram。 以前的控制器navigationBar保持可见似乎没问题。

请查看此CCSlideNavigationTransition 。 希望对你有帮助!

导航栏概念作为Facebook的/ Instagram的iOS7应用程序