iOS7 Facebook导航栏行为

4
我的应用与Facebook / Instagram的iOS7应用程序有着几乎相同的导航概念:一个容器视图控制器,带有5个选项卡,每个选项卡都有一个导航控制器作为其根视图控制器。
我现在正在尝试为第一个选项卡的导航控制器的根视图控制器(即第一个“真实”的VC,而不仅仅是像NavVC这样的容器)复制Facebook的navigationBar行为。
我能够使用UIScrollView的委托方法(scrollViewDidScroll:,scrollViewWillBeginDragging:,scrollViewDidEndDragging:)实现隐藏/显示navigationBar。
注意:navigationBar的frame.origin.y被手动偏移到顶部。 我没有使用
    [self.navigationController setNavigationBarHidden:]

到目前为止,事情进展得非常顺利。但是我遇到了两个问题,无法想出解决方案:

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

为了解决这个问题,在被推入的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?

这就是我要寻找的行为:一个干净的转换,旧的navigationBar保持隐藏,推送的viewController的bar被显示。

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

第二个问题:是否有一种方法可以实现全局处理程序,以便在任何viewController中创建此行为,而无需在每个viewController中实现scrollDelegate逻辑? 我想到了一个符合UIScrollView Delegate的委托对象。

谢谢你的帮助 :)

2个回答

1
我编写了一个自定义的导航控制器子类,用于滑动动画过渡。它的行为类似于Facebook/Instagram。上一个控制器的navigationBar保持可见,看起来不错。
请查看这个CCSlideNavigationTransition。希望对你有帮助!

navigation bar concept as Facebook's / Instagram's iOS7 Apps


1
长话短说:我为此构建了自己的自定义容器。它提供了在选项卡之间切换的能力,以及在每个选项卡上推送新的ViewControllers的能力。有点像UINavigationController和UITabBarController之间的混合体。
如果您需要更详细的答案,请告诉我。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接