导航堆栈在取消iOS 7反滑动手势后变得不可用

我遇到了一个问题,我的导航控制器在启动后取消了新的iOS 7反滑手势后变得不可用。

一些相关信息:

  • 我的应用程序有一个主页与各种活动页面。
  • 主页将导航栏隐藏在viewWillAppear中
  • 主页在viewWillDisappear中隐藏导航栏

    -(void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // Let's hide the navbar when we show the home view [self.navigationController setNavigationBarHidden:YES]; … } -(void) viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; // Let's hide the navbar when we show the home view [self.navigationController setNavigationBarHidden:NO]; } 

当用户点击主页上的活动图标时,活动的视图控制器被压入堆栈。

如果用户开始在iOS中使用新的后滑动手势,但然后停止手势(即决定不回去),一切都看起来不错。 但是,如果用户导致另一个视图控制器在导航堆栈上被压入,则标签栏将变得不可用,用户将无法从当前视图控制器导航回去。

笔记

  • 只有当我显示/隐藏导航栏时才会发生
  • 我仍然可以慢慢地执行背部手势,只要我不取消手势,一切都会正常工作
  • 导航栏似乎会工作,但点击后退button不会popup视图控制器。

不知道你是否已经解决了这个问题,但我面临同样的问题,但有一个区别。 如果将setAnimated设置为NO,导航堆栈只会混乱。

所以这个工作:

 [self.navigationController setNavigationBarHidden:YES animated:YES]; ... [self.navigationController setNavigationBarHidden:NO animated:YES]; 

但是这不是:

 [self.navigationController setNavigationBarHidden:YES animated:NO]; ... [self.navigationController setNavigationBarHidden:NO animated:NO]; 

如果你真的想animation为任何原因为NO,一个解决方法是将alpha设置为0/1而不是隐藏/取消隐藏NavigationBar:

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.navigationController.navigationBar.alpha = 0.0f; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.navigationController.navigationBar setAlpha:1.0f]; } 

缺点是没有很好的幻灯片播放过渡animation。 如果你find了更好的办法,请让我们知道。

更新 :这是现在老,但我解决了我的问题,不确保在当前视图的viewWillDisappear中更改任何状态,在viewWillAppear恢复。 不要拆毁视图中的东西将显示您不能再次设置。

这是取消popup式animation时发生的情况:


  1. 当前视图将会消失
  2. 新视angular将会出现
  3. [取消…反转]
  4. 新的viewWillDisappear
  5. 新的viewDidDisappear
  6. 目前的观点会出现
  7. 目前的观点出现了

我猜在这个勇敢的新世界里,viewWillDisappear / viewWillAppear并不总是意味着查看“will”消失/出现:)

我想我的解决scheme可能会帮助你。

假设你的主页视图控制器的类是HomePageViewController(类名),活动视图控制器被称为ActivityViewController(也是类名)

首先,在你的HomePageViewController的viewWillAppear:

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController setNavigationBarHidden:YES]; } 

其次,在你的ActivityViewController中,添加这些代码:

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController setNavigationBarHidden:NO animated:YES]; } - (void)viewWillDisappear:(BOOL)animated { //trick to fix navigationbar disappear problem that when UIScreenEdgePanGesture is happening. if ([self.navigationController.topViewController isKindOfClass:[HomePageViewController class]]) { [self.navigationController setNavigationBarHidden:YES animated:YES]; } else { [self.navigationController setNavigationBarHidden:NO animated:YES]; } [super viewWillDisappear:animated]; } 

我有同样的问题,并search后,看起来像你不能得到一个通知,如果手势取消。 在手势识别器委托上没有-willReshowViewController ,导航控制器上没有-willReshowViewController 。 所以我有视图控制器需要显示的导航栏(即正在取消的控制器)设置self.navigationController.navigationBarHidden = NO-viewWillAppear 。 这样当手势被取消并且调用了-viewWillAppear ,导航栏将被再次取消隐藏。 据我所知,这是取消手势时只有轻扫手势和显示/隐藏导航栏没有问题的唯一方法。

我能够解决这个问题,通过使用animated: true viewWillAppearanimated: falseviewWillDisappear的第二个视图控制器