Iphone 与InteractivePGestureRecognitor一起调整位置

Iphone 与InteractivePGestureRecognitor一起调整位置,iphone,ios,objective-c,uinavigationcontroller,ios7,Iphone,Ios,Objective C,Uinavigationcontroller,Ios7,我有一个自定义控件,包含一行按钮,模仿选项卡栏。当UINavigationController离开根视图控制器时,此控件滑出视图,当导航到根视图控制器时滑回视图 在iOS 7中,有一个UIScreenedGePangestureRecognitor,它提供了滑动返回的手势。因此,我正在修改我的自定义控件,以便幻灯片数量对应于UIScreenedGePangestureRecognitor的翻译 问题是,当用户释放触摸时,我如何判断UINavigationController是否将导航回或反弹回原

我有一个自定义控件,包含一行按钮,模仿选项卡栏。当
UINavigationController
离开根视图控制器时,此控件滑出视图,当导航到根视图控制器时滑回视图

在iOS 7中,有一个UIScreenedGePangestureRecognitor,它提供了滑动返回的手势。因此,我正在修改我的自定义控件,以便幻灯片数量对应于
UIScreenedGePangestureRecognitor
的翻译

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

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

要知道它是否应该返回,一个优雅的解决方案是检测最后一个动作

这意味着如果用户向左移动一些像素并释放->反弹 如果用户向右移动一些像素并释放->显示上一个控制器

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

这样说:


CGPoint point=[识别器位置视图:视图]

我知道这是一个相当古老的问题,所以答案可能对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]);
    }];
}
-(void)导航控制器:(UINavigationController*)导航控制器将显示视图控制器:(UIViewController*)视图控制器已设置动画:(BOOL)已设置动画
{
id tc=navigationController.topViewController.transitionCoordinator;
[tc notifyWhenInteractionEndsUsingBlock:^(id上下文){
NSLog(@“完成!!!”);
NSLog(@“容器视图:%@,[context containerView]);
NSLog(@“来自VC:%@,[context ViewControllerWorky:UITransitionContextFromViewControllerKey]);
NSLog(@“至VC:%@,[context ViewControllerWorky:UITransitionContextToViewControllerKey]);
NSLog(@“初始交互:%i”,[context initiallyInteractive]);
NSLog(@“完成曲线:%d”,[context completionCurve]);
NSLog(@“已设置动画:%i”,[上下文已设置动画];
NSLog(@“已取消:%i”,[上下文已取消];
NSLog(@“是交互式的:%i,[上下文是交互式的]);
NSLog(@“完成百分比:%f”,[context percentComplete]);
NSLog(@“表示样式:%d”,[context presentationStyle]);
NSLog(@“转换持续时间:%f”,[context transitionDuration]);
}];
}

当用户抬起手指,动画完全反转或完成时,这将触发。
[上下文被取消]将告诉您它是否已反转或已完成。上下文对象中还有很多其他有用的信息。

当用户松开手指时,我如何知道导航是否会返回?我的想法是用导航动画为我的自定义选项卡栏设置动画。我最近发现了一个更简单的平移手势识别器解决方案:您可以使用velocity属性:[识别器VelocityView:self.view]。如果x值为正=向右移动=向后移动非常有用。我很沮丧,苹果公司没有提供任何关于如何检查弹出手势是否被取消的文档(或者他们只是假设我们会知道过渡协调员)。明亮的