完成转换时的io7导航检查

时间:2014-05-20 08:20:05

标签: ios ios7 uinavigationcontroller swipe

我想标记我的UINavigationController是否为动画(推/弹)。

我有一个BOOL变量(_isAnimating),下面的代码似乎有效:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    _isAnimating = YES;
}

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    _isAnimating = NO;
}

但它在iOS7中使用滑动手势无法正常工作。假设我的导航是:root->查看A - >查看B.我现在在B。

  • 在开始滑动(从B回到A)时,会调用功能“navigationController:willShowViewController:animated:(BOOL)animated”,然后调用_isAnimating = YES

  • 正常情况是滑动完成(返回A),调用函数“navigationController:didShowViewController:animated:(BOOL)animated”,然后调用_isAnimating = NO。这种情况没问题,但是:

  • 如果用户可能只是滑动一半(半转换到A),然后不想滑动到上一个视图(视图A),他再次转到当前视图(再次保持B)。然后未调用函数“navigationController:didShowViewController:animated:(BOOL)animated”,我的变量值(_isAnimating=YES)不正确。

在这种异常情况下,我没有机会更新我的变量。有没有办法更新导航状态?谢谢!

1 个答案:

答案 0 :(得分:4)

可以在 UINavigationController interactivePopGestureRecognizer 属性中找到解决问题的线索。这是识别器,它通过滑动手势响应弹出控制器。当用户举起手指时,您会注意到识别器的状态已更改为 UIGestureRecognizerStateEnded 。因此,除了导航控制器委托,您还应该将目标添加到Pop识别器:

UIGestureRecognizer *popRecognizer = self.navigationController.interactivePopGestureRecognizer;
[popRecognizer addTarget:self                       
                  action:@selector(navigationControllerPopGestureRecognizerAction:)];

每次Pop识别器更改时都会调用此操作,包括手势结束。

- (void)navigationControllerPopGestureRecognizerAction:(UIGestureRecognizer *)sender
{
    switch (sender.state)
    {
        case UIGestureRecognizerStateEnded:

        // Next cases are added for relaibility
        case UIGestureRecognizerStateCancelled:
        case UIGestureRecognizerStateFailed:

            _isAnimating = NO;
            break;

        default:
            break;
    }
}

P.S。不要忘记自iOS 7以来interactivePopGestureRecognizer属性可用!