我的应用与Facebook / Instagram的iOS7应用程序有着几乎相同的导航概念:一个容器视图控制器,带有5个选项卡,每个选项卡都有一个导航控制器作为其根视图控制器。
我现在正在尝试为第一个选项卡的导航控制器的根视图控制器(即第一个“真实”的VC,而不仅仅是像NavVC这样的容器)复制Facebook的navigationBar行为。
我能够使用UIScrollView的委托方法(scrollViewDidScroll:,scrollViewWillBeginDragging:,scrollViewDidEndDragging:)实现隐藏/显示navigationBar。
注意:navigationBar的frame.origin.y被手动偏移到顶部。 我没有使用
我现在正在尝试为第一个选项卡的导航控制器的根视图控制器(即第一个“真实”的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的推送/弹出行为?
这就是我要寻找的行为:一个干净的转换,旧的navigationBar保持隐藏,推送的viewController的bar被显示。
注意:截图是在新的“从左到右滑动返回”的iOS7手势期间拍摄的。
第二个问题:是否有一种方法可以实现全局处理程序,以便在任何viewController中创建此行为,而无需在每个viewController中实现scrollDelegate逻辑? 我想到了一个符合UIScrollView Delegate的委托对象。
谢谢你的帮助 :)