如何使用 touchesBegan 和 touchesEnded 检测点击手势

Posted

技术标签:

【中文标题】如何使用 touchesBegan 和 touchesEnded 检测点击手势【英文标题】:How to detect a tap gesture using touchesBegan and touchesEnded 【发布时间】:2018-07-17 08:35:41 【问题描述】:

我创建了一个直接从类UIView 派生的自定义控件。现在,如果用户点击我视图的特定部分,我想执行一个操作。所以我重写了方法touchesBegantouchesEndedtouchesCancelled。问题是,如果我只是点击显示屏,则永远不会调用方法 touchesEnded。方法 touchesCancelled 被称为 insted。 touchesEnded 仅在我执行某些手势(滑动、移动……)时被调用。

我是否需要配置我的视图以启用点击手势?

我的代码:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    NSLog(@"touchesBegan");
    self->touchDown = YES;
    [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^
        self.value = 1.0;
     completion:nil];


- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 


- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
    if (self->touchDown) 
        NSLog(@"touchesEnded");
        self->touchDown = NO;
        [UIView animateWithDuration:0.3 animations:^
            self.value = 0.0;
         completion:nil];
    


- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
    if (self->touchDown) 
        NSLog(@"touchesCancelled");
        self->touchDown = NO;
        [UIView animateWithDuration:0.3 animations:^
            self.value = 0.5;
         completion:nil];
    

对于我得到的点击手势:

2018-07-17 09:55:20.994645+0200 ios 测试[33049:2763212] touchesBegan

2018-07-17 09:55:21.092409+0200 iOS 测试[33049:2763212] touchesCancelled

【问题讨论】:

您是否尝试过使用您的代码对 UIView 类进行子类化并添加一个gestureRecognizer? 是的,UITapGestureRecognirer 工作得很好,但我想避免使用手势识别器。 【参考方案1】:

您是否尝试在视图中设置recognizer.cancelsTouchesInView = NO;

一个布尔值,影响在识别手势时是否将触摸传递到视图。

【讨论】:

不,我没有。但我不在自定义视图中使用手势识别器。方法 touchesBegan, ... 直接来自 UIView。 检查您是否在涉及的任何视图控制器上启用了手势识别,如果是,请将其关闭。你的问题看起来很像有一个识别器在某处取消你的触摸 好的,我意识到,我的 UIController 中有一个全局手势检测器。所以这真的可以帮助我解决我的问题。谢谢【参考方案2】:

你应该经历这个。

来自 Apple 文档,

https://developer.apple.com/documentation/uikit/uigesturerecognizer?changes=_4&language=objc

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
 
   // Sent to the gesture recognizer when one or more fingers touch down in the associated view.



- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 

    //Sent to the gesture recognizer when one or more fingers move in the associated view.


- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 

   //Sent to the gesture recognizer when one or more fingers lift from the associated view.


- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
 
   //Sent to the gesture recognizer when a system event (such as an incoming phone call) cancels a touch event.
 

【讨论】:

我已经阅读了文档,对于 UIView::touchesEnded 有写“当一个或多个手指从视图或窗口中抬起时告诉响应者。”。但这不是它在我的应用程序中的行为方式。

以上是关于如何使用 touchesBegan 和 touchesEnded 检测点击手势的主要内容,如果未能解决你的问题,请参考以下文章

你如何知道在 touchesBegan 中被触摸的对象是啥?

touchesBegan,如何获得所有的接触,而不仅仅是第一次或最后一次?

TouchesBegan 总是返回错误的 UIView

touchesBegan 在 PDFView 中没有触发

UIScrollView touchesBegan

在 `touchesBegan:withEvent:` 之后禁用所有 UIPanGestureRecognizer