我无法通过多次触摸获得UIView
来回复我想要的内容。基本上某些UITouch
es位于UITouchPhaseBegan
,但从未进入UITouchPhaseEnded
或UITouchPhaseCancelled
。这是我用来处理触摸的代码,从touchesBegan:withEvent
,touchesMoved:withEvent
,touchesEnded:withEvent
和touchesCancelled:withEvent
调用。如果我将一根手指放下,另一只手指移动它们,然后同时释放它们,NSLog
输出有时开始!开始了!结束了!而不是开始!开始了!圆满结束!结束!。这些接触是否会在某处丢失?我怎样才能跟踪它们?
- (void) handleTouchEvent:(UIEvent *)event {
for( UITouch* touch in [event allTouches] ) {
if( touch.phase == UITouchPhaseBegan ) {
NSLog(@"Began!");
if( ![m_pCurrentTouches containsObject:touch] )
[m_pCurrentTouches addObject:touch];
uint iVoice= [m_pCurrentTouches indexOfObject:touch];
CGPoint location = [touch locationInView:self];
m_pTouchPad->SetTouchPoint( location.x, location.y, iVoice );
m_pTouchPad->SetIsTouching( true, iVoice );
}
else if( touch.phase == UITouchPhaseMoved ) {
uint index= [m_pCurrentTouches indexOfObject:touch];
CGPoint location = [touch locationInView:self];
m_pTouchPad->SetTouchPoint( location.x, location.y, index );
}
else if( touch.phase == UITouchPhaseEnded || touch.phase == UITouchPhaseCancelled ) {
uint index= [m_pCurrentTouches indexOfObject:touch];
[m_pCurrentTouches removeObject:touch];
NSLog(@"Ended!");
m_pTouchPad->SetIsTouching( false, index );
}
}
}
修改
我正在提供赏金,因为我真的想要一个很好的解决方案。总结一下:我需要一个系统,其中开始的每一次触摸也都结束,所以如果用户放下一根手指然后放下另一根手指,我可以看到两个触摸开始,并且当没有手指时再次与设备接触,我看到两个接触都结束了。
我是否采取了错误的策略来实现这一目标?
答案 0 :(得分:1)
一个事件可以报告很多事情。所以你有时会得到“结束!”曾经,因为只有一个事件到达并且只进行了一次触摸事件处理程序调用 - 但它报告了两个触摸结束。如果您手动处理多个同时触摸(手指),则您可以单独跟踪每个触摸并检查每个事件中的每次触摸,以查看报告的触摸次数并决定要执行的操作。
Apple提供了示例代码,说明如何通过维护CFDictionaryRef:
来完成此操作(向下滚动到“处理多点触控事件”一节。)
答案 1 :(得分:1)
刚试过你的代码,这有一些问题。
有时因为touchesBegan
被召唤两次并且第一次有一次开始触摸第二次有两次开始触摸,我得到“开始开始开始结束”。
我不知道为什么你没有拆分方法并将代码放入touchesBegan
,touchesMoved
,touchesEnded
方法。但是你应该使用从参数传递的touches
而不是[event allTouches]
。
- (void) handleTouches:(NSSet *)touches {
for( UITouch* touch in touches ) {
if( touch.phase == UITouchPhaseBegan ) {
NSLog(@"Began!");
}
else if( touch.phase == UITouchPhaseMoved ) {
}
else if( touch.phase == UITouchPhaseEnded || touch.phase == UITouchPhaseCancelled ) {
NSLog(@"Ended!");
}
}
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self handleTouches:touches];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
[self handleTouches:touches];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[self handleTouches:touches];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
[self handleTouches:touches];
}