我想标记我的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)
不正确。
在这种异常情况下,我没有机会更新我的变量。有没有办法更新导航状态?谢谢!
答案 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
属性可用!