iOS如何在任何视图控制器中捕获触摸?

时间:2014-07-30 17:03:41

标签: ios objective-c uiview touch gestures

我正在寻找一种方法来捕获用户可能在我的应用程序的屏幕内进行的触摸(X,Y)位置(相对于视图控制器的大多数向后视图)。

我有没有办法继承某种类型的(UIResponder?)或在UIView 上添加一个类别,以便能够拦截触摸,处理它们,但仍允许它们与内容进行交互(按钮,手势识别器等)?

我正在考虑实施“touchesBegan:”,但根据我的经验,经常会混淆现有的按钮或手势识别器逻辑。

2 个答案:

答案 0 :(得分:1)

你可以有一个基本的View Controller,它是一个UIGestureRecognizerDelegate,你的每个视图控制器子类都有一个手势识别器,可以监听触摸。

-(void)viewDidLoad{
    ...

    UIGestureRecognizer *gestureRecognizer = [[UIGestureRecognizer alloc] initWithTarget:self action:@selector(gestureAction:)];
    [gestureRecognizer setEnabled:YES];
    [gestureRecognizer setCancelsTouchesInView:NO];
    [gestureRecognizer setDelaysTouchesBegan:NO];
    [gestureRecognizer setDelaysTouchesEnded:NO];
    [gestureRecognizer setDelegate:self];
    [self.view addGestureRecognizer:gestureRecognizer];
...
}

然后有你的手势识别器代码

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    NSLog(@"view touch (%f,%f)",[touch locationInView:self.view].x,[touch locationInView:self.view].y);
    return YES;
}

答案 1 :(得分:1)

这可能达到一些限制。 Todd Reed GitHub上有一个示例项目,您也可以使用该代码并根据需要进行修改。

快速查看代码,使用混合方法并在该视图上呈现触摸,将自定义UIWindow保持在最顶层。它还使用sendEvent:类的UIApplication方法,该方法将事件重定向到视图层次结构中。

这比在每个视图控制器上使用UIGestureRecognizer更加优雅。许多分析解决方案也非常有效地实现了这一目标。