取消iOS 7后滑动手势后,导航堆栈变得无法使用

时间:2013-11-11 20:50:44

标签: ios uinavigationcontroller ios7 uinavigationbar

我遇到一个问题,我的导航控制器在启动然后取消新的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中使用新的后滑动手势,但随后停止手势(即决定不返回),一切看起来都不错。但是,如果用户导致另一个视图控制器被推入导航堆栈,那么唠叨栏就会变得无法使用,用户无法从当前视图控制器导航回来。

备注

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

5 个答案:

答案 0 :(得分:16)

不确定你是否已经解决了这个问题,但我遇到了同样的问题,但有一点不同。如果我将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];

如果您真的希望动画因任何原因而变为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];
}

缺点是没有很好的幻灯片到弹出过渡动画。如果您确实找到了更好的方法,请告诉我们。

UPDATE :现在已经过时了但是我通过不确保在viewWillAppear中恢复当前视图中viewWillDisappear中的任何状态而解决了我的问题。请勿在viewWillDis中删除您无法重新设置的内容。

取消流行动画时会发生这种情况:


  1. 当前viewWillDisappear
  2. 新viewWillAppear
  3. [取消...倒置]
  4. 新viewWillDisappear
  5. 新viewDidDisappear
  6. 当前viewWillAppear
  7. 当前viewDidAppear

  8. 我想在这个勇敢的新世界中,viewWillDisappear / viewWillAppear并不总是意味着视图“将”消失/出现:)

答案 1 :(得分:3)

我认为我的解决方案可能会对您有所帮助。

假设您的主页视图控制器的类是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];
}

答案 2 :(得分:2)

我遇到了同样的问题,在搜索后,看起来如果手势被取消,你就无法收到通知。手势识别器委托中没有-shouldCancel,导航控制器上没有-willReshowViewController。所以我的视图控制器需要显示的导航栏(即正在取消的控制器)在self.navigationController.navigationBarHidden = NO中设置-viewWillAppear。这样,当取消手势并调用-viewWillAppear时,导航栏将再次被取消隐藏。据我所知,这是在取消手势时同时使用向后滑动手势和显示/隐藏导航栏没有问题的唯一方法。

答案 3 :(得分:1)

它可以帮助您避免冻结应用程序。

- (void)navigationController:(UINavigationController *)navigationController
       didShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animate
{
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
    {
        if (self.navigationController.viewControllers.count > 1)
        {
            self.navigationController.interactivePopGestureRecognizer.enabled = YES;
        }
        else
        {
            self.navigationController.interactivePopGestureRecognizer.enabled = NO;
        }
    }
}

答案 4 :(得分:0)

我可以使用animated: true中的viewWillAppear和第二个视图控制器的animated: false中的viewWillDisappear来解决此问题