【问题标题】:iOS how to capture touches within any view controller?iOS 如何在任何视图控制器中捕获触摸?
【发布时间】:2014-07-30 17:03:40
【问题描述】:
我正在寻找一种方法来捕获用户可能在我的应用程序屏幕中进行的触摸的 (X,Y) 位置(相对于视图控制器的最后视图)。
有没有办法让我继承某种(UIResponder?)或在 UIView 上添加一个类别能够拦截触摸、处理它们,但仍然允许它们与内容交互(按钮、手势识别器等)?
我正在考虑实现“touchesBegan:”,但根据我的经验,这经常会弄乱现有的按钮或手势识别器逻辑。
【问题讨论】:
标签:
ios
objective-c
uiview
touch
gestures
【解决方案1】:
这在一定程度上是可能的。 Todd Reed 在GitHub 上有一个示例项目,您也可以使用该代码并根据需要对其进行修改。
快速浏览一下代码,它使用 swizzled 方法在顶部保留了一个自定义 UIWindow,并在该视图上呈现触摸。它还使用UIApplication 类的sendEvent: 方法,将事件重定向到视图层次结构中。
这是一个比在每个视图控制器上使用UIGestureRecognizer 更优雅的解决方案。许多分析解决方案也非常有效地做到了这一点。
【解决方案2】:
你可以有一个基本的视图控制器,它是一个 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;
}