【问题标题】:io7 navigation check when finish transition完成过渡时的io7导航检查
【发布时间】:2014-07-08 09:37:36
【问题描述】:

我想标记我的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-> view A -> view 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)

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

【问题讨论】:

  • 您是否尝试过使用 UIViewController 的 isBeingPresented 属性?
  • 超!你试过viewWillAppear:吗?
  • @henryeverett 和 Thanh-NhonNGUYEN isBeingPresented 和 viewWillAppear: 在 A 或 B 内。我的代码不是 A 或 B,它是另一个类(它是 UINavigationController 的代表,它的角色是导航管理器)。另外,我的代码可能有很多视图,有A,B,C,D,......不仅A和B
  • 你为什么不只跟踪各个 VC 的 viewWillAppear:(BOOL)animated 和 viewWillDisappear:(BOOL)animated 方法中的变量?添加一个委托协议并使 VC 符合它。如果这是你想要的,那应该让你的经理能够接收来自 VC 的回电。
  • @camdaochemgio 你有任何解决方案。我遇到了同样的问题

标签: ios ios7 uinavigationcontroller swipe


【解决方案1】:

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

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

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

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

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

            _isAnimating = NO;
            break;

        default:
            break;
    }
}

附:不要忘记 interactivePopGestureRecognizer 属性自 iOS 7 起可用!

【讨论】:

  • 我不太擅长UINavigationControllers,如何检测动画结束后是显示第一个视图控制器还是第二个视图控制器?我曾尝试使用 navigationController 属性,但它在方法内部为空。状态也没有用,它总是在我的测试中结束。知道如何检测到这一点吗?
  • “第一个”和“第二个”控制器是什么意思?如果需要了解用户是否完成了手势,可以添加标志_swipeCompleted 和在didShowViewController 方法中将其设置为YES。您还可以查看导航控制器的viewControllers 属性,它始终包含堆栈中的所有控制器。如果您需要知道将显示哪个控制器动画结束之前,使用传递给willShowViewController的变量viewController
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多