在多点触控期间,UITouches“丢失”

时间:2011-12-13 02:58:06

标签: ios uiview multi-touch uitouch touches

我无法通过多次触摸获得UIView来回复我想要的内容。基本上某些UITouch es位于UITouchPhaseBegan,但从未进入UITouchPhaseEndedUITouchPhaseCancelled。这是我用来处理触摸的代码,从touchesBegan:withEventtouchesMoved:withEventtouchesEnded:withEventtouchesCancelled: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 );
        }
    }
}

修改

我正在提供赏金,因为我真的想要一个很好的解决方案。总结一下:我需要一个系统,其中开始的每一次触摸也都结束,所以如果用户放下一根手指然后放下另一根手指,我可以看到两个触摸开始,并且当没有手指时再次与设备接触,我看到两个接触都结束了。

我是否采取了错误的策略来实现这一目标?

2 个答案:

答案 0 :(得分:1)

一个事件可以报告很多事情。所以你有时会得到“结束!”曾经,因为只有一个事件到达并且只进行了一次触摸事件处理程序调用 - 但它报告了两个触摸结束。如果您手动处理多个同时触摸(手指),则您可以单独跟踪每个触摸并检查每个事件中的每次触摸,以查看报告的触摸次数并决定要执行的操作。

Apple提供了示例代码,说明如何通过维护CFDictionaryRef:

来完成此操作

http://developer.apple.com/library/IOs/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MultitouchEvents/MultitouchEvents.html#//apple_ref/doc/uid/TP40009541-CH3-SW7

(向下滚动到“处理多点触控事件”一节。)

答案 1 :(得分:1)

刚试过你的代码,这有一些问题。 有时因为touchesBegan被召唤两次并且第一次有一次开始触摸第二次有两次开始触摸,我得到“开始开始开始结束”。

我不知道为什么你没有拆分方法并将代码放入touchesBegantouchesMovedtouchesEnded方法。但是你应该使用从参数传递的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];
}