检测用户是不是在 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 上

触摸屏物体识别到底是怎么实现的

iOS/Android 是不是可以知道用户何时触摸了广告?

如何检测NSTextAttachment上的触摸

在 Xcode 中检测任何触摸(不是 TapGesture)

检测何时触摸另一个视图 - 在本机反应中使用 PanResponder 拖动