我一直在认识iOS应用程序中的触摸,我有这个简单的代码
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"%lu",(unsigned long)[touches count]);
[touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
UITouch *touch = obj;
CGPoint touchLocation = [touch locationInNode:self.scene];
NSLog(@"B x:%f - y:%f",touchLocation.x,touchLocation.y);
}];
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
UITouch *touch = obj;
CGPoint touchLocation = [touch locationInNode:self.scene];
NSLog(@"E x:%f - y:%f",touchLocation.x,touchLocation.y);
}];
}
touchesBegan被称为罚款,如果我同时从屏幕上的1个手指放到5个手指,我看到它被正确的信息调用
touchesBegan
同样没有发生,很多时候如果我在屏幕上有3个手指并同时移除它们,我只看到2个触摸的信息被结束(有时甚至1个)。如果我一次取出一个手指,该方法通常也会被调用2次(有时为1次,尽管很少被称为正确的3次)
随着触摸次数的增加,touchesEnded
方法中未显示某些信息的可能性
方法touchesMoved:withEvent:
和touchesCancelled:withEvent:
也使用相同的逻辑
有人可以解释这种行为吗?我有什么遗失的吗?
答案 0 :(得分:25)
您必须在Swift中设置recognizer.cancelsTouchesInView = false
或在Objective-C中设置recognizer.cancelsTouchesInView = NO;
答案 1 :(得分:21)
尝试删除该视图中的所有手势识别器。他们可能会干扰touchesEnded
。
答案 2 :(得分:5)
如果不调用super的实现,则必须覆盖所有触摸方法。因此,您还必须实施touchesMoved:withEvent:
和touchesCancelled:withEvent:
方法。实现可以是空的,但你必须这样做。
<强>
touchesBegan:withEvent:
强>如果在不调用super的情况下覆盖此方法(常用) pattern),你还必须覆盖其他处理触摸的方法 事件,如果仅作为存根(空)实现。
答案 3 :(得分:1)
尝试覆盖UIView
的{{1}}方法:
hitTest
当您抬起手指时,他们可能无法识别出- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
return self;
}
,因此不会调用UIView
。
答案 4 :(得分:1)
内部信息:
我正在使用:
- 1个手指UITapGestureRecognizer
- 1个手指UILongPressGestureRecognizer
- 1指双击UITapGestureRecognizer
- 两根手指点击UITapGestureRecognizer
- 1个UIPinchGestureRecognizer
并且也应该用一根手指摇摄。但是我发现的是 即使用户抬起一根手指,捏手势也不会结束。 iOS仍然以某种方式通过“ Changed”调用Pinch的选择器 状态。
我的解决方案是使用touchesBegin / Moved / Ended来抓锅 并使用有效触摸次数作为安全检查,以防出现挤压 选择器将被调用。
在进行上述配置时必须使用的其他设置:
self.multipleTouchEnabled = YES;
[oneFingerTapRecognizer requireGestureRecognizerToFail:oneFingerLongPressRecognizer];
[oneFingerTapRecognizer requireGestureRecognizerToFail:oneFingerDoubleTapRecognizer];
[oneFingerLongPressRecognizer requireGestureRecognizerToFail:oneFingerDoubleTapRecognizer];
[twoFingersTapRecognizer requireGestureRecognizerToFail:twoFingersPinch];
答案 5 :(得分:0)
我遇到了同样的问题,并在结束的触摸中用这个简单的代码解决了它:
NSInteger touchCount = 0;
for (UITouch *touch in touches) {
touchCount++;
if([[event allTouches]count] == touchCount){
// do what you have to do here
}
}
//这里会收到警告,但不关心它
我希望这有帮助!
答案 6 :(得分:0)
即使在定义了所有四个触摸处理程序之后,我也遇到了同样的问题。我也没有任何主动识别器。
我的解决方案就是在我的视图上启用多点触控事件,就像这样
self.multipleTouchEnabled = YES;
神奇地解决了这个问题。
请注意,我确实得到了&#34;多点触控&#34;甚至在此之前的事件,即同时多个手指的事件,但我有上述问题,并非所有这些都被正确结束。
希望有人帮助! :)