我的应用程序与 Facebook / Instagram 的 iOS7 应用程序具有或多或少相同的导航概念:
一个具有 5 个选项卡的 ContainerViewController,每个选项卡都有一个 NavigationController 作为 rootViewController。
我现在尝试为第一个选项卡的 navigationController 的 rootViewController 重现 Facebook 的 navigationBar 行为(-> 第一个“真正的”VC,而不仅仅是像 NavVC 这样的容器)。
我能够使用 UIScrollView Delegate 方法(scrollViewDidScroll:、scrollViewWillBeginDragging:、scrollViewDidEndDragging:)实现隐藏/显示导航栏
注意: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 推送动画正确匹配。
问题:当我向后导航(弹出推送的 TO)时,导航栏保持可见。
我能够通过在两个 ViewController 上创建和设置一些属性来解决这个问题,但这是一个巨大的混乱,而且会变得更加hacky,因为我必须将 3 或 4 个不同的 ViewController 类型推送到这个导航堆栈上。
我的问题(最后-.-):
我怎样才能实现类似于 Facebook 的推送/弹出行为?
这就是我正在寻找的行为:一个干净的过渡,其中“旧”导航栏保持隐藏状态,并显示推送的 viewController 栏。
注意:屏幕截图是在新的“从左向右滑动返回”iOS7 手势期间拍摄的。
第二个问题:是否有一种方法可以实现全局处理程序,以便在任何 viewController 中创建此行为,而不必在每个 viewController 中实现scrollDelegate 逻辑?
我正在考虑一个符合 UIScrollView Delegate 的委托对象。
感谢您的帮助 :)