如何使用 touchesBegan 和 touchesEnded 检测点击手势
Posted
技术标签:
【中文标题】如何使用 touchesBegan 和 touchesEnded 检测点击手势【英文标题】:How to detect a tap gesture using touchesBegan and touchesEnded 【发布时间】:2018-07-17 08:35:41 【问题描述】:我创建了一个直接从类UIView
派生的自定义控件。现在,如果用户点击我视图的特定部分,我想执行一个操作。所以我重写了方法touchesBegan
、touchesEnded
和touchesCancelled
。问题是,如果我只是点击显示屏,则永远不会调用方法 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 中被触摸的对象是啥?