UITouches "потерял" во время мультитач - PullRequest
1 голос
/ 13 декабря 2011

У меня не получается заставить UIView ответить, как я хочу, несколькими прикосновениями.По сути, UITouch находятся в 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 );
        }
    }
}

РЕДАКТИРОВАТЬ:

Я предлагаю вознаграждение, потому что я действительно хочу хорошее решение для этого.Подводя итог: мне нужна система, в которой каждое касание, которое начинается, также заканчивается , поэтому, если пользователь кладет один палец, а затем другой в другое место, я вижу, что оба касания начинаются, и к тому времени, когда в нем нет пальцевконтакт с устройством больше, я видел конец обоих касаний.

Я преследую неправильную стратегию для достижения этой цели?

Ответы [ 2 ]

1 голос
/ 10 января 2012

Только что попробовал ваш код, у которого есть некоторые проблемы.Иногда я получаю «Began Began Began End End» для двух пальцев, потому что touchesBegan звонят два раза, и первый раз - одно начальное касание, второй раз - два начальных касания.

Я не знаю, почему вы этого не сделалиt разделить метод и поместить код в методы 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];
}
1 голос
/ 10 января 2012

Одно событие может сообщить о многих касаниях. Таким образом, вы иногда получаете "Завершено!" один раз, потому что прибыло только одно событие и был сделан только один вызов обработчика события касания - но он сообщил, что оба касания заканчиваются. Если вы обрабатываете несколько одновременных касаний (пальцев) вручную, вы должны отслеживать каждое касание в отдельности и проверять каждое касание в каждом событии, чтобы увидеть, сколько ваших касаний сообщается, и решить, что делать.

У Apple есть пример кода, показывающий, как это сделать, поддерживая CFDictionaryRef:

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

(Прокрутите вниз до раздела «Обработка событий с несколькими касаниями».)

...