Wypróbowałem nieco inne podejście, aby zapobiec przewijaniu i odbijaniu obiektów UIWebView : dodając rozpoznawanie gestów, aby zastąpić inne gesty.
Wygląda na to, że UIWebView lub jego widok przewijania używa własnego rozpoznawania gestów panoramy do wykrywania przewijania użytkownika. Ale zgodnie z dokumentacją Apple istnieje uzasadniony sposób na zastąpienie jednego rozpoznawania gestów innym. Protokół UIGestureRecognizerDelegate ma metodę gestRecognizer: shouldRecognizeSimultentlyWithGestureRecognizer: - który pozwala kontrolować zachowanie dowolnych kolidujących gestów.
Więc to, co zrobiłem, było
w metodzie viewDidLoad kontrolera widoku:
// 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];
następnie metoda przesłonięcia gestu:
// 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;
}
Oczywiście ta metoda delegowania może być bardziej złożona w prawdziwej aplikacji - możemy selektywnie wyłączać inne moduły rozpoznające, analizując inny plik GestureRecognizer.view i podejmując decyzję na podstawie tego, jaki to widok.
I wreszcie, ze względu na kompletność, metodę, którą zarejestrowaliśmy jako program obsługi panoramowania:
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer
{
// do nothing as of yet
}
może być pusty, jeśli wszystko, czego chcemy, to anulować przewijanie i podskakiwanie widoków internetowych, lub może zawierać nasz własny kod do implementacji takich ruchów panoramy i animacji, których naprawdę chcemy ...
Jak dotąd eksperymentuję z tymi wszystkimi rzeczami i wydaje się, że działają mniej więcej tak, jak tego chcę. Jednak nie próbowałem jeszcze przesyłać żadnych aplikacji do iStore. Ale wydaje mi się, że do tej pory nie korzystałem z niczego nieudokumentowanego ... Jeśli ktoś uzna to inaczej, proszę o informację.