iOS - 通过在左边缘平移来弹出视图控制器,导航栏消失

时间:2014-04-06 16:32:44

标签: ios objective-c

因此iOS 7引入了这项新功能,您可以通过在左边缘平移来弹出视图控制器。这是我的问题:我有两个视图控制器,A和B,通过push segue连接。两个控制器都有导航栏(通过在导航控制器中嵌入A)。一旦用户进入B的场景,B中的导航栏将被隐藏,并且如果用户点击场景,则可以显示该导航栏。如果用户在隐藏导航栏的同时在B的左边缘进行平移,则A中的导航栏也将被隐藏,这意味着用户无法从A进一步返回。所以有没有办法执行A以始终显示导航栏而不管B是否隐藏了栏?或者有一种简单的方法可以防止平移手势生效吗?我阅读了this post,其中提出了一种防止平移的方法,但我无法在故事板中找到该属性。

编辑:所以我禁用了交互式弹出手势识别器,但这只能解决问题的一半。另一半是如果我在导航栏消失时单击子视图控制器导航栏上的后退按钮,我将导航回到没有导航栏的父视图控制器。我尝试在[self.navigationController setNavigationBarHidden:NO]中调用viewWillAppear然后viewDidLoad,但它不起作用。这是SDK中的某种错误还是我错过了什么?

以下是在子视图控制器中隐藏导航栏的代码

- (void)hideNavigationBar
{
    if (self.navigationBarHidden == NO)
    {
        [UIView animateWithDuration:UINavigationControllerHideShowBarDuration animations:^{
            self.navigationController.navigationBar.alpha = 0.0;
            self.previewCollectionView.alpha = 0.0;
        } completion:^(BOOL finished) {
            self.navigationBarHidden = YES;
        }];
    }
}

2 个答案:

答案 0 :(得分:1)

是的,您可以在A viewController的-viewWillAppear方法中强制执行导航栏的外观。

此外,由于您无法在故事板中找到interactivePopGestureRecognizer属性,因此可以在A viewController的-viewDidLoad方法中使用此行:

self.navigationController.interactivePopGestureRecognizer.enabled = NO;

修改

viewWillAppear method中,您必须致电:

[self.navigationController setNavigationBarHidden:NO];
self.navigationController.navigationBar.alpha = 1.0;

答案 1 :(得分:1)

我发现你的情况有几个问题:

  1. 您禁用交互式弹出手势,并从视图控制器B隐藏导航栏。用户应该如何直观地返回?

  2. 在B中隐藏导航栏的动画可能会导致问题。如果它超过一秒钟,那么在您点击后退按钮并且-viewWillAppear触发A之前,该动画可能无法及时完成。

  3. B中的代码隐藏了导航控制器的导航栏。 保存视图控制器A的导航控制器与保存视图控制器B的实例相同。如果在B加载时隐藏导航栏,则返回A(不知道你是怎么做的没有后退按钮或边缘平移手势),它仍然应该被隐藏。

  4. 您可能不希望禁用手势(以便用户可以直观地返回)并在视图控制器A的-viewWillAppear中重新打开导航栏,以覆盖您在B中将其关闭的情况:

    if (self.navigationBarHidden == NO)
    {
        self.navigationController.navigationBar.alpha = 1.0;
        self.previewCollectionView.alpha = 1.0;
        self.navigationBarHidden = NO;
    }