2013-09-26 28 views
4

我有一个自定义控件,包含一排按钮,模仿标签栏。当UINavigationController远离根视图控制器时,此控件滑出视图,并在导航到根目录时滑回。与interactivePopGestureRecognizer一起调整位置

在iOS 7中,有​​可以提供滑动后退手势。我正在修改我的自定义控件,以便滑动量对应于​​的翻译。

问题是,当用户释放触摸时,如何判断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 
    } 
} 

回答

1

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

知道是否应该返回的优雅解决方案是检测最后一次移动。

含义,如果用户去一些像素的左侧和发布 - >反弹 如果用户去一些像素的权利和发布 - >显示以前的控制器

这可以,如果你保存的地点进行在状态改变并且比较它到状态结束。

获得这样的点:

CGPoint点= [识别locationInView:视图]。

+1

如何知道导航是否会返回?当用户释放手指时? 我的想法是用导航动画动画我的自定义标签栏。 –

+1

我最近发现了Pan Gesture识别器的一个更简单的解决方案:您可以使用velocity属性:[recognitionizer velocityInView:self.view]。如果x值为正值=向右移动=返回 – Nilz11

4

我知道这是一个相当古老的问题,所以答案可能不适用于OP,但也许对其他人有用。我昨天遇到了同样的问题,并且在网络的其他部分进行了大量搜索,但没有发现任何内容。 所以这里是我用于类似问题的解决方案。这是在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];会告诉你它是否颠倒或完成。在上下文对象中还有很多其他很好的信息可以使用。

+0

令人难以置信的帮助。我非常沮丧,Apple没有提供任何关于如何检查流行手势是否被取消的文档(或者他们只是假设我们会了解过渡协调员)。辉煌。 – ninjaneer