与interactivePopGestureRecognizer一起调整位置

时间:2013-09-26 09:30:19

标签: iphone ios objective-c uinavigationcontroller ios7

我有一个自定义控件,包含一行按钮,模仿标签栏。当UINavigationController导航离开根视图控制器时,此控件将滑出视图,并在导航到根目录时滑回。

使用iOS 7时,UIScreenEdgePanGestureRecognizer会提供向后滑动的手势。因此,我正在修改自定义控件,以便幻灯片数量与UIScreenEdgePanGestureRecognizer的翻译相对应。

问题是,当用户释放触摸时,如何判断UINavigationController是否会导航或弹回原始视图?

[self.interactivePopGestureRecognizer addTarget:self action:@selector(panningBack:)];


- (void) panningBack:(UIPanGestureRecognizer *)recognizer
{
    // Snipped - Code that reads the recognizer translation and adjust custom control y position

    if (recognizer.state == UIGestureRecognizerStateEnded)
    {
        // Question: Does it go back, or does it not?

        // If it goes back, slide custom control into view
        // Else slide custom control out of view
    }
}

2 个答案:

答案 0 :(得分:5)

我知道这是一个相当古老的问题所以答案可能不会对OP有用,但可能对其他人有用。我昨天遇到了同样的问题,并在没有真正找到任何东西的情况下对SO进行了大量搜索。 所以这是我用于类似问题的解决方案。这是在navigationcontroller委托中实现的,但我想如果能够更好地满足您的需求,您可以在其他地方实现。

    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    id<UIViewControllerTransitionCoordinator> tc = navigationController.topViewController.transitionCoordinator;
    [tc notifyWhenInteractionEndsUsingBlock:^(id<UIViewControllerTransitionCoordinatorContext> context) {
        NSLog(@"DONE!!!");
        NSLog(@"Container View: %@", [context containerView]);
        NSLog(@"From VC: %@", [context viewControllerForKey:UITransitionContextFromViewControllerKey]);
        NSLog(@"To VC: %@", [context viewControllerForKey:UITransitionContextToViewControllerKey]);
        NSLog(@"Initially Interactive: %i", [context initiallyInteractive]);
        NSLog(@"Completion Curve: %d", [context completionCurve]);
        NSLog(@"Is Animated: %i", [context isAnimated]);
        NSLog(@"Is Cancelled: %i", [context isCancelled]);
        NSLog(@"Is Interactive: %i", [context isInteractive]);
        NSLog(@"Percent Complete: %f", [context percentComplete]);
        NSLog(@"Presentation Style: %d", [context presentationStyle]);
        NSLog(@"Transition Duration: %f", [context transitionDuration]);
    }];
}

当用户抬起手指并且动画相反或完成时,这将触发。 [context isCancelled];将告诉您它是否反转或完成。在上下文对象中还有很多其他可以使用的好信息。

答案 1 :(得分:1)

我想说最简单的解决方案是使用导航控制器中实现的默认手势。当视图出现时显示条形并在条形消失时隐藏它。

一个优雅的解决方案,用于了解它是否应该返回,将是检测最后一个动作。

意思是如果用户向左移动一些像素并释放 - &gt;反弹 如果用户向右移动一些像素并释放 - &gt;显示以前的控制器

如果您将位置保存在已更改的状态并将其与状态结束进行比较,则可以执行此操作。

明白这一点:

CGPoint point = [识别器locationInView:view];