J'ai essayé une approche légèrement différente pour empêcher les objets UIWebView de défiler et de rebondir: ajouter un reconnaisseur de gestes pour remplacer les autres gestes.
Il semble que UIWebView ou sa sous-vue de défilement utilise son propre identificateur de mouvement panoramique pour détecter le défilement de l'utilisateur. Mais selon la documentation d'Apple, il existe un moyen légitime de remplacer un identificateur de gestes par un autre. Le protocole UIGestureRecognizerDelegate a une méthode gestureRecognizer: shouldRecognizeSimultaneousWithGestureRecognizer: - qui permet de contrôler le comportement de tout identificateur de mouvements en collision.
Donc, ce que j'ai fait
dans la méthode viewDidLoad du contrôleur de vue:
// 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];
puis, la méthode de remplacement de geste:
// 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;
}
Bien sûr, cette méthode déléguée peut être plus complexe dans une application réelle - nous pouvons désactiver d'autres reconnaisseurs de manière sélective, en analysant otherGestureRecognizer.view et prendre une décision en fonction de la vue.
Et, enfin, par souci d'exhaustivité, la méthode que nous avons enregistrée en tant que gestionnaire de pan:
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer
{
// do nothing as of yet
}
il peut être vide si tout ce que nous voulons est d'annuler le défilement et le rebond des vues Web, ou il peut contenir notre propre code pour implémenter le type de mouvements de panoramique et d'animations que nous voulons vraiment ...
Jusqu'à présent, je ne fais qu'expérimenter avec toutes ces choses, et cela semble fonctionner plus ou moins comme je le veux. Cependant, je n'ai pas encore essayé de soumettre des applications à iStore. Mais je crois que je n'ai encore rien utilisé sans papiers ... Si quelqu'un le trouve autrement, veuillez m'en informer.