Intenté un enfoque ligeramente diferente para evitar que los objetos UIWebView se desplazaran y rebotaran: agregando un reconocedor de gestos para anular otros gestos.
Parece que UIWebView o su subvista de desplazamiento utiliza su propio reconocedor de gestos panorámicos para detectar el desplazamiento del usuario. Pero de acuerdo con la documentación de Apple, existe una forma legítima de anular un reconocedor de gestos con otro. El protocolo UIGestureRecognizerDelegate tiene un método GestorReconocidor: shouldRecognizeSim simultáneamentelywithGestureRecognizer: - que permite controlar el comportamiento de cualquier reconocedor de gestos en colisión.
Entonces, lo que hice fue
en el método viewDidLoad del controlador de vista:
// Install a pan gesture recognizer // We ignore all the touches except the first and try to prevent other pan gestures
// by registering this object as the recognizer's delegate
UIPanGestureRecognizer *recognizer;
recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
recognizer.delegate = self;
recognizer.maximumNumberOfTouches = 1;
[self.view addGestureRecognizer:recognizer];
self.panGestureFixer = recognizer;
[recognizer release];
entonces, el método de anulación de gestos:
// Control gestures precedence
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
// Prevent all panning gestures (which do nothing but scroll webViews, something we want to disable in
// the most painless way)
if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]])
{
// Just disable every other pan gesture recognizer right away
otherGestureRecognizer.enabled = FALSE;
}
return NO;
}
Por supuesto, este método delegado puede ser más complejo en una aplicación real: podemos deshabilitar otros reconocedores de forma selectiva, analizar otherGestureRecognizer.view y tomar una decisión en función de qué vista es.
Y, finalmente, en aras de la exhaustividad, el método que registramos como manejador de pan:
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer
{
// do nothing as of yet
}
puede estar vacío si todo lo que queremos es cancelar el desplazamiento y el rebote de las vistas web, o puede contener nuestro propio código para implementar el tipo de movimientos panorámicos y animaciones que realmente queremos ...
Hasta ahora solo estoy experimentando con todo esto, y parece estar funcionando más o menos como lo quiero. Sin embargo, todavía no he intentado enviar ninguna aplicación a iStore. Pero creo que no he usado nada indocumentado hasta ahora ... Si alguien encuentra lo contrario, infórmeme.