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
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
Gracias por esta respuesta. Estaba rasgándome el pelo con esto. –