Ich habe einen etwas anderen Ansatz versucht, um zu verhindern, dass UIWebView- Objekte scrollen und springen können: Hinzufügen eines Gestenerkenners, um andere Gesten zu überschreiben.
Es scheint, dass UIWebView oder seine Scroller-Unteransicht einen eigenen Pan-Gesten-Erkenner verwendet, um das Scrollen von Benutzern zu erkennen. Laut Apples Dokumentation gibt es jedoch eine legitime Möglichkeit, einen Gestenerkenner mit einem anderen zu überschreiben. Das UIGestureRecognizerDelegate- Protokoll verfügt über eine Methode gestureRecognizer: shouldRecognizeSimultaneousWithGestureRecognizer: - Mit dieser Methode kann das Verhalten kollidierender Gestenerkenner gesteuert werden.
Also, was ich getan habe war
in der viewDidLoad-Methode des View Controllers:
// 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];
dann die Gestenüberschreibungsmethode:
// 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;
}
Natürlich kann diese Delegatmethode in einer realen Anwendung komplexer sein - wir können andere Erkenner selektiv deaktivieren, otherGestureRecognizer.view analysieren und Entscheidungen basierend auf der Ansicht treffen.
Und schließlich der Vollständigkeit halber die Methode, die wir als Pan-Handler registriert haben:
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer
{
// do nothing as of yet
}
Es kann leer sein, wenn wir nur das Scrollen und Bouncen von Webansichten abbrechen möchten, oder es kann unseren eigenen Code enthalten, um die Art von Schwenkbewegungen und Animationen zu implementieren, die wir wirklich wollen ...
Bisher experimentiere ich nur mit all dem Zeug und es scheint mehr oder weniger so zu funktionieren, wie ich es will. Ich habe jedoch noch nicht versucht, Apps an iStore zu senden. Aber ich glaube, ich habe bisher nichts undokumentiertes verwendet ... Wenn jemand etwas anderes findet, informieren Sie mich bitte.