检测用户是不是在 iOS 上触摸过屏幕
Posted
技术标签:
【中文标题】检测用户是不是在 iOS 上触摸过屏幕【英文标题】:Detect if user has touched the screen on iOS检测用户是否在 iOS 上触摸过屏幕 【发布时间】:2014-04-09 15:05:30 【问题描述】:我搜索了其他几个问题和教程,但找不到我的问题的答案。我想检测用户是否触摸/点击/按住/单击了屏幕。我尝试使用touchesBegan: withEvent:
,但它没有触发任何事件。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
UITouch *touch = [touches anyObject];
if ([touch view] == mapView_)
NSLog(@"Touches began");
else NSLog(@"Touches began");
还有其他方法可以通过触摸屏幕来检测用户交互吗?
【问题讨论】:
这取决于您要达到的目标。您可以使用 UIButton 或其他类型的控件、视图上的手势识别器、touchesBegan:... 和朋友... 这一切都取决于,真的。touchesBegan
应该可以工作,你能举个例子吗?
@Douglas 问题已编辑。
@WWJD 你在哪个类中添加了这个方法?那个类真的被使用了吗?
touchesBegan:withEvent:
方法是在 UIResponder 类上定义的。当你想自己处理touchesBegan:withEvent:
时,你可以创建一个从UIViewController继承的新类(它又从UIResponder继承),然后将touchesBegan:withEvent:
添加到新类中。
【参考方案1】:
您必须使用 UITapGestureRecognizer。
使您的班级符合UIGestureRecognizerDelegate
协议。
实例化手势识别器。例如,要实例化一个 UITapGestureRecognizer,我们将这样做:
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];
这里,action 是处理手势的选择器。在这里,我们的选择器 handleTapFrom 看起来像:
- (void) handleTapFrom: (UITapGestureRecognizer *)recognizer
//Code to handle the gesture
选择器的参数是手势识别器。我们可以使用这个手势识别器来访问它的属性,例如,我们可以找到手势识别器的状态,如 UIGestureRecognizerStateBegan、UIGestureRecognizerStateEnded 等。
在实例化的手势识别器上设置所需的属性。例如,对于 UITapGestureRecognizer,我们可以设置属性 numberOfTapsRequired 和 numberOfTouchesRequired。
将手势识别器添加到要检测手势的视图中。在我们的示例代码中(我将分享该代码供您参考),我们将使用以下代码行将手势识别器添加到 imageView:
[self.imageView addGestureRecognizer:tapGestureRecognizer];
将手势识别器添加到视图后,设置手势识别器的委托,即处理所有手势识别器内容的类。在我们的示例代码中,它会是这样的:
tapGestureRecognizer.delegate = self;
注意:在将手势识别器添加到视图后分配委托。否则不会调用action方法。
参考 - Here
【讨论】:
您不必必须使用手势识别器。这当然是一种方法,但覆盖-touchesBegan:withEvent:
也可以。
此外,点击识别器不会识别所有触摸,因此它可能不是 OP 想要的。【参考方案2】:
解决方案是使用UIPanGestureRecogniser
。
这是解决问题并停止头痛的代码:
UIPanGestureRecognizer *tap = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];
[mapView_ setMultipleTouchEnabled:YES];
[mapView_ setUserInteractionEnabled:YES];
mapView_.gestureRecognizers = @[tap];
然后是选择器方法:
- (void) handleTapFrom: (UIPanGestureRecognizer*)recogniser
NSLog(@"Pin");
【讨论】:
【参考方案3】:如果你只关心用户是否触摸屏幕,你可以继承UIApplication
,并实现这个方法:
- (void)sendEvent:(UIEvent *)event
[super sendEvent:event];
if (event.type == UIEventTypeTouches)
// handling code
在这种情况下,main.m
文件如下所示:
int main(int argc, char * argv[])
@autoreleasepool
return UIApplicationMain(argc, argv, @"UIApplicationSubclass", @"AppDelegate");
【讨论】:
改为子类UIWindow
可能会更好。子类化UIApplication
是相当不寻常的。该窗口仍处于事件调度过程的顶部附近,并且应该处理所有相同的事件。以上是关于检测用户是不是在 iOS 上触摸过屏幕的主要内容,如果未能解决你的问题,请参考以下文章
检测触摸何时开始在屏幕上的任何位置,即使是在 UIButton 上