Ho provato un approccio leggermente diverso per impedire agli oggetti UIWebView di scorrere e rimbalzare: l'aggiunta di un riconoscimento di gesti per sovrascrivere altri gesti.
Sembra che UIWebView o la sua sottoview scroller utilizzino il proprio riconoscimento dei gesti di panoramica per rilevare lo scorrimento dell'utente. Ma secondo la documentazione di Apple esiste un modo legittimo di scavalcare un riconoscitore di gesti con un altro. Il protocollo UIGestureRecognizerDelegate ha un metodo gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer: - che consente di controllare il comportamento di eventuali riconoscitori di gesti in collisione.
Quindi, quello che ho fatto è stato
nel metodo viewDidLoad del controller di visualizzazione:
// 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];
quindi, il metodo di override del gesto:
// 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;
}
Naturalmente, questo metodo delegato può essere più complesso in un'applicazione reale: possiamo disabilitare altri riconoscitori in modo selettivo, analizzando otherGestureRecognizer.view e prendendo decisioni in base a quale vista sia.
E, infine, per completezza, il metodo che abbiamo registrato come gestore della panoramica:
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer
{
// do nothing as of yet
}
può essere vuoto se tutto ciò che vogliamo è annullare lo scorrimento e il rimbalzo delle visualizzazioni Web, oppure può contenere il nostro codice per implementare il tipo di movimenti di pan e animazioni che vogliamo davvero ...
Finora sto solo sperimentando tutte queste cose e sembra funzionare più o meno come lo voglio. Tuttavia, non ho ancora provato a inviare alcuna app a iStore. Ma credo di non aver usato nulla di non documentato finora ... Se qualcuno lo trova diversamente, per favore informami.