2011-10-16 35 views
6

Actualicé mi iPad a 5.0 hace un par de días, y actualicé Xcode a 4.2 al mismo tiempo para poder continuar probando mis aplicaciones. Ahora estoy teniendo problemas con el código táctil en varias aplicaciones que funcionaban con versiones anteriores de Xcode.El comportamiento de manejo táctil UIView cambió con Xcode 4.2?

I subclassed UIImageView para agregar algunas características de arrastre sobrescribiendo -(void)TouchesBegan y -(void)TouchesMoved. Hice no sobreescribo -(void)TouchesEnded en la subclase, pero manejé eso en el controlador de vista para la vista que contiene la vista de imagen.

Tiré de la subclase UIImageView en un nuevo proyecto para la prueba, y han reducido el problema al hecho de que el padre UIView (la plantilla creada por Xcode) no parece ser eventos de toque de envío hasta el controlador de vista (también creado por Xcode).

Si agrego esto a mi subclase:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touches ended event in ImageToDrag"); 
    [self.nextResponder touchesEnded:touches withEvent:event]; 
} 

y esto a mi vista padre controlador de vista:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touches ended event in ViewController"); 
} 

cuando suelto de la imagen estoy arrastrando alrededor de la pantalla, lo obtener el "touches ended event in ImageToDrag", pero no el registro del controlador de vista.

Sin embargo, si intencionalmente a saltar sobre la vista al hacer esto en la vista subclases:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touches ended event in ImageToDrag"); 
    [[self.nextResponder nextResponder] touchesEnded:touches withEvent:event]; 
} 

en cuando me siento ambas entradas del registro.

La única explicación que se me ocurre es que, por algún motivo, UIView consume el evento touchesEnded y no lo pasa al controlador de vista.

He comprobado que exclusiveTouch se establece en NO y userInteractionEnabled se establece en YES en la vista padre y la subclases UIImageView.

También he probado la compilación para iOS 5.0 y iOS 4.2, y la implementación de la aplicación de prueba tanto en un iPad con iOS 5 como con iOS 4.3.1.

La única forma en que he podido obtener el evento táctil en el viewController es omitiendo la vista y utilizando el doble nextResponder en la subclase. Aunque ese método funciona, me parece un truco y estoy seguro de que volverá para morderme más tarde.

¿Alguien más ha visto este comportamiento? ¿Hay alguna forma de que averigüe qué está haciendo el UIView con mis eventos táctiles?

Gracias, Dan

Respuesta

5

He estado tratando de encontrar un problema similar en las últimas horas. Finalmente logró resolver con la ayuda de this post

En realidad, parece que se ríe de resolverlo, utilizando la pista de https://devforums.apple.com/message/519690#519690
Anteriormente, sólo remití el caso touchesEnded a self.nextResponder. Cuando agregué toca los manejadores Beke, Moved, Cancelled con implementaciones similares como toquesEnded, el evento parece burbujear hasta el controlador de vista raíz .
Así que supongo que en iOS5, las vistas descartan los eventos Tocados en cuando no han visto los toques relevantes. Comenzó.

No necesité agregar Moved/etc., Acabo de reenviarlo en TouchesBegan, y luego TouchesEnded comienza a trabajar de nuevo.

+0

Esto hizo el truco. La clave fue que tuve que reenviar mis eventos a la supervista después de procesarlos. Otra nota es que tuve que usar "super" en lugar de "self.nextResponder" para que funcione. – dlenhard

+0

Gracias por esta respuesta. Estaba rasgándome el pelo con esto. –

2

un manejo táctil hicieron oportunidad en iOS 5.0; especialmente si vuelve a vincular su aplicación con el 5.0 SDK.

Hay métodos de manipulación táctil una sección de UIView que dice esto:

Si reemplazar este método sin llamar a super (un patrón de uso común), también debe prevalecer sobre los demás métodos para el manejo de eventos de toque, aunque sólo como implementaciones stub (empy).

Así que si haces una, tienes que hacerlas todas. Sé que UIKit comenzó a tomar medidas para asegurarse de que este fuera el caso en 5.0.

Así que comenzaría allí: anulará todos los métodos en su vista y verá qué sucede.

+0

Estoy sobrepasando toques Empecé y toquéMovido en la subclase ... pero no tocó cancelado. Voy a intentar eso para ver si lo aclara. – dlenhard

+0

Traté de sobreescribir toques en la vista también, y todavía no funciona sin usar el doble nextResponder. – dlenhard

Cuestiones relacionadas