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

Posted

技术标签:

【中文标题】iOS - 通过在左边缘平移弹出视图控制器,导航栏消失【英文标题】:iOS - pop a view controller by panning on the left edge, navigation bar disappears 【发布时间】:2014-04-06 16:32:44 【问题描述】:

所以 ios 7 引入了这个新功能,您可以通过在左边缘平移来弹出视图控制器。这是我的问题:我有两个视图控制器 A 和 B,它们通过 push segue 连接。两个控制器都有导航栏(通过在导航控制器中嵌入 A)。 B 中的导航栏在用户进入 B 的场景后会被隐藏,如果用户在场景中点击则可以显示。如果用户在导航栏隐藏的情况下在B的左边缘平移,那么A中的导航栏也会被隐藏,这意味着用户无法从A返回更远的地方。那么有没有办法强制 A 始终显示导航栏,无论 B 是否隐藏了导航栏?或者有没有一种简单的方法可以防止平移手势生效?我阅读了this post,它提出了一种防止泛音的方法,但我无法在情节提要中找到该属性。

编辑: 所以我禁用了交互式弹出手势识别器,但这只解决了一半的问题。另一半是如果我在导航栏消失时单击子视图控制器导航栏上的后退按钮,我将导航回没有导航栏的父视图控制器。我尝试在viewWillAppear 中调用[self.navigationController setNavigationBarHidden:NO],然后在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;
        ];
    

【问题讨论】:

你能把你用来隐藏导航栏的代码贴出来吗? 再次,请发布您用于隐藏导航栏的代码。 刚刚发布。请看一看。 【参考方案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;

【讨论】:

甜蜜!我通过禁用手势识别器解决了这个问题。但我想知道它是如何启用的。不是禁用该属性的默认值吗?在我的应用程序中,A 还通过 push segue 连接到另一个视图控制器 C,但是平移手势在 C 上不起作用。 我遇到了一个新问题...请参阅原始问题中的编辑部分。 调用self.navigationController.navigationBar.alpha = 1.0 有效!【参考方案2】:

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

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

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

    您在 B 中的代码隐藏了导航控制器的导航栏。 保存视图控制器 A 的导航控制器与保存视图控制器 B 的实例相同。 如果您在 B 加载时隐藏导航栏,那么您将返回 A(不确定您是如何做到的没有后退按钮或边缘平移手势),它仍应被隐藏。

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

if (self.navigationBarHidden == NO)

    self.navigationController.navigationBar.alpha = 1.0;
    self.previewCollectionView.alpha = 1.0;
    self.navigationBarHidden = NO;

【讨论】:

如果用户单击一次,导航栏就会返回,这就是他们返回视图控制器 A 的方式。 所以当他们把导航栏带回来,然后他们点击“返回”是隐藏在A上的导航栏吗? 不,它显示出来了,这是我所期望的。我没想到的是,即使我强制将栏显示在 A 中,当栏正在隐藏在 B 中的途中,它仍然是隐藏的。你的解释是有道理的。你能详细说明你的代码吗? 所以,我仍然对您的问题感到困惑。所以......你点击回来,因为酒吧通过动画隐藏自己?然后当弹出完成时,该栏隐藏在 A 中,即使您在 A 的-viewWillAppear 中取消隐藏它?我有这个权利吗?我的代码将撤消 B 中的动画所做的操作,而无需动画。我建议隐藏/显示没有动画的栏,看看是否有区别。如果确实如此,则问题可能是动画的竞争条件。 是的,我尝试在栏通过动画隐藏时向后点击。即使我强制它显示在 A 的 viewDidAppear 中,该栏也被隐藏了。

以上是关于iOS - 通过在左边缘平移弹出视图控制器,导航栏消失的主要内容,如果未能解决你的问题,请参考以下文章

我已经隐藏了导航栏和状态栏,现在屏幕边缘平移手势返回不起作用,这是典型的吗?

将默认的 interactivePopGestureRecognizer 扩展到屏幕边缘之外?

iOS 11:带有不透明导航栏的导航控制器内带有滚动视图的弹出视图控制器在转换期间导致奇怪的内容动画

使用 edgePanning 从一个视图控制器导航到下一个视图控制器

推送/弹出期间类似消息的更高/标准导航栏

ios 最佳实践 - 导航和选项卡控制器以及推送/弹出