Por que o toque do UIViewController começa, tocaMovedos e toques? Acontece apenas quando o primeiro de dois toques começa, move ou termina?

Estou tendo um problema ao lidar com mais de um toque por meio dos métodos toquesBegan / Movido / Finalizado do UIViewController. Eu também estou vendo o mesmo comportamento em um aplicativo cocos2d (usando ccTouchesBegan / Moved / Ended), então acho que essa pergunta pode ser aplicada a todo o manuseio de toque no iOS. Coloquei o código que estou usando abaixo, seguido pelos resultados que estou vendo.

Todos os métodos são implementados em uma subclasse UIViewController.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches Began");
    [self logTouchesFor: event];

    [super touchesEnded: touches withEvent: event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches Moved");
    [self logTouchesFor: event];

    [super touchesEnded: touches withEvent: event];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches Ended");
    [self logTouchesFor: event];

    [super touchesEnded: touches withEvent: event];
}

-(void)logTouchesFor:(UIEvent *)event
{
    int count = 1;

    for (UITouch *touch in event.allTouches)
    {
        CGPoint location = [touch locationInView: self.view];

        NSLog(@"%d: (%.0f, %.0f)", count, location.x, location.y);
        count++;
    }
}

Agora, pelos resultados interessantes ...

Toques simples funcionam como esperado

Digamos que eu toque na tela com o polegar. Eu vejo na janela de saída que tocaBegan foi chamado como esperado. Eu movo meu polegar ao redor e tocoMoved é chamado. Então eu levanto o polegar da tela e tocoEnded é chamado. Tudo isso é como esperado, estou incluindo na questão como um caso de controle - só para ficar claro que o meu controlador de visualização está recebendo eventos de toque e eu não perdi umvc.view.userInteractionEnabled = YES qualquer lugar.

O segundo toque não causa toques de comida, toques de amor ou toques

Este é o mais interessante. Digamos que eu toque a tela com o polegar (toque em vegansBegan) e segure-a ainda na tela. Então, toco em outro lugar da tela com o dedo indicador, enquanto mantenho o polegar no mesmo lugar. TouchesBegan não é chamado. Então, digamos que eu mova meu dedo indicador enquanto mantém meu polegar absolutamente imóvel (isso pode ser complicado, mas é possível). TouchesMoved não é chamado. Então, eu levanto meu dedo indicador da tela. TouchesEnded não é chamado. Finalmente, eu movo meu polegar e toquesMoved é chamado. Então eu levanto meu polegar da tela e toquesEnded é chamado.

Só para ficar claro: eu definiself.view.multipleTouchEnabled = YES no meuviewDidLoad método.

Informações sobre o segundo toque estão disponíveis, fornecendo os primeiros movimentos de toque

Desta vez eu faço algo muito semelhante ao exemplo imediatamente acima. Eu toco a tela com o polegar, depois com o dedo indicador enquanto ainda mantenho o polegar. TouchesBegan é chamado quando meu polegar bate na tela, mas não no meu dedo indicador. Agora eu movo meu polegar e toquesMoved é chamado. Não só isso, mas há dois toques no array event.allTouches (e sim, o segundo toque é onde eu esperaria que fosse). Isso significa que o sistema está ciente de que toquei a tela uma segunda vez, mas não estou sendo notificado pelos métodos de manipulação de toque no meu controlador de exibição.

Como posso ser notificado sobre alterações no segundo toque?

Eu realmente gostaria de poder responder às mudanças na localização ou no estado do segundo toque quando elas acontecem, em vez de quando o primeiro toque também muda. Na maior parte do tempo, isso não será um problema, pois é muito difícil alterar um toque sem afetar o outro, mas tenho pelo menos uma situação em que isso pode ser um problema. Estou faltando alguma coisa óbvia? Alguém mais percebeu esse comportamento ou teve problemas com ele?

Caso seja relevante, estou usando um iPhone 3GS executando o iOS 5.1.

questionAnswers(1)

yourAnswerToTheQuestion