¿Por qué UIViewController tocaBegan, tocaMoved y touches Ended solo se llaman cuando el primero de los dos toques comienza, se mueve o termina?

Tengo un problema con el manejo de más de un toque a través de los métodos touchesBegan / Moved / Ended de UIViewController. También estoy viendo el mismo comportamiento en una aplicación cocos2d (usando ccTouchesBegan / Moved / Ended), así que creo que esta pregunta se puede aplicar a todo el manejo táctil en iOS. He puesto el código que estoy usando a continuación, seguido por los resultados que estoy viendo.

Todos los métodos se implementan en una subclase 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++;
    }
}

Ahora para los resultados interesantes ...

Toques individuales funcionan como se espera

Digamos que toco la pantalla con mi pulgar. Veo en la ventana de salida que se ha llamado a touchesBegan como se esperaba. Muevo mi pulgar alrededor y toca Moved se llama. Luego levanto mi dedo pulgar de la pantalla y toquesEnded se llama. Todo esto es como se esperaba, lo incluyo en la pregunta como un caso de control, solo para aclarar que mi controlador de vista está recibiendo eventos táctiles y no me he perdido unvc.view.userInteractionEnabled = YES en cualquier sitio.

El segundo toque no hace que se toquen. Empiezan, tocan Movido o toca.

Este es el más interesante. Digamos que toco la pantalla con el pulgar (se toca touchBegan) y la mantengo inmóvil en la pantalla. Luego toco en otro lugar de la pantalla con mi dedo índice, mientras mantengo mi pulgar en el mismo lugar. TouchesBegan no se llama. Entonces digamos que muevo mi dedo índice mientras mantengo mi pulgar absolutamente quieto (esto puede ser complicado pero es posible). No se llama TouchesMoved. Entonces, levanto mi dedo índice de la pantalla. TouchesEnded no se llama. Finalmente, muevo mi pulgar y se toca tocar es mover. Luego levanto mi pulgar de la pantalla y se toca el toque de Finalizado.

Sólo para ser claros: he puestoself.view.multipleTouchEnabled = YES en miviewDidLoad método.

La información sobre Second Touch está disponible, lo que proporciona los primeros movimientos táctiles

Esta vez hago algo muy similar al ejemplo inmediatamente anterior. Toco la pantalla con el pulgar, luego el índice, sin mover el pulgar. Se llama a TouchesBegan cuando mi pulgar toca la pantalla, pero no mi dedo índice. Ahora muevo mi pulgar, y se toca tocar se mueve. No solo eso, sino que hay dos toques en la matriz event.allTouches (y sí, el segundo toque es donde esperaría que estuviera). Esto significa que el sistema es consciente de que he tocado la pantalla por segunda vez, pero no se me notifica a través de los métodos de manejo táctil de mi controlador de vista.

¿Cómo puedo ser notificado sobre los cambios en el Second Touch?

Realmente me gustaría poder responder a los cambios en la ubicación o el estado del segundo toque a medida que ocurren, en lugar de cuando el primer toque también cambia. La mayoría de las veces, esto no será un problema porque es muy difícil cambiar un toque sin impactar en el otro, pero tengo al menos una situación en la que puede ser un problema. ¿Me estoy perdiendo algo obvio? ¿Alguien más ha notado este comportamiento o ha tenido problemas con él?

En caso de que sea relevante, estoy usando un iPhone 3GS con iOS 5.1.

Respuestas a la pregunta(1)

Su respuesta a la pregunta