2010-09-06 18 views
22

J'essaie de reconnaître le mouvement de balayage gauche/droite dans un UIScrollView. J'ai essayé de créer UISwipeGestureRecognizers et de les associer à la vue déroulante. Cela fonctionne mais très rarement. La plupart du temps, je ne suis pas appelé. Pourquoi?Comment reconnaître le mouvement de balayage dans UIScrollView

Comment puis-je faire glisser mon doigt de gauche à droite pour travailler? Puis-je utiliser le geste ou reconnaisseurs dois-je gérer moi-même en quelque sorte dans touchesBegan/Ended

Merci

Répondre

38

figured it out. Dans mon cas, mon UIScrollView contenait un UIImage que j'avais autorisé à zoomer. Apparemment, cela signifiait que le défilement était activé et que l'UIScrollView avait du mal à faire la distinction entre les gestes destinés à faire défiler et à glisser (image suivante, précédente).

La clé dans mon cas est de désactiver le défilement dans la vue défilement lorsque l'image n'est pas agrandie, et de la rouvrir quand elle est agrandie. Ceci fournit le comportement attendu.

La pièce critique est de mettre ce qui suit dans le délégué de la vue de défilement:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView { 
    if (scrollView.zoomScale!=1.0) { 
    // Zooming, enable scrolling 
    scrollView.scrollEnabled = TRUE; 
    } else { 
    // Not zoomed, disable scrolling so gestures get used instead 
    scrollView.scrollEnabled = FALSE; 
    } 
} 

Je dois aussi initialiser la vue de défilement avec défilement désactivé. Pour activer le zoom, il suffit de fournir une image sur un appel délégué,

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { 
    // Return the scroll view 
    return myImage; 
} 

et définir quelques parms dans viewDidLoad pour les reconnaisseurs de zoom et le geste de configuration ainsi

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    myScrollView.contentSize = CGSizeMake(myImage.frame.size.width, myImage.frame.size.height); 
    myScrollView.maximumZoomScale = 4.0; 
    myScrollView.minimumZoomScale = 1.0; 
    myScrollView.clipsToBounds = YES; 
    myScrollView.delegate = self; 

    [myScrollView addSubview:myImage]; 
    [self setWantsFullScreenLayout:TRUE]; 

    myScrollView.scrollEnabled = FALSE; 
    UISwipeGestureRecognizer *recognizer = 
    [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; 
    recognizer.delaysTouchesBegan = TRUE; 
    [myScrollView addGestureRecognizer:recognizer]; 
    [recognizer release]; 

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; 
    recognizer.direction = UISwipeGestureRecognizerDirectionLeft; 
    [myScrollView addGestureRecognizer:recognizer]; 
    [recognizer release]; 
    [myScrollView delaysContentTouches]; 
} 
+0

vraiment excellent trouver David. mes reconnaisseurs de balayage ont également échoué à travailler.J'ai abandonné et utilisé touchesBegan: avec NSNotification, mais il a également donné une notification pour MasterViewControllers (dans l'iPad) .i était flou de la recherche de ce problème. Vous avez économisé mon temps n énergie !! merci du fond du cœur David. Continuez à publier des trucs .. passez une bonne journée. – gopikrishnan

+0

Merci pour l'astuce – iOSAppDev

+0

Ou peut-être en une ligne - scrollView.scrollEnabled = (échelle! = 1.0f) – Yariv

4

Bonne poste. Je faisais une chose similaire (pas de vue d'image) et je devais fondamentalement désactiver le défilement si la taille de contenu était plus petite que la hauteur (mon affichage de défilement défile seulement verticalement).

if (scrollView.contentSize.height>scrollView.frame.size.height) { 
    scrollView.scrollEnabled = YES; 
} 
else { 
    scrollView.scrollEnabled = NO; 
} 

qui a fait l'affaire pour moi

24
UIScrollView *scrollView = ... 
UISwipeGestureRecognizer *mySwipe = ... 

La bonne solution pour résoudre ce problème est d'ajouter une ligne de code:

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:mySwipe] 

Version Swift:

scrollView.panGestureRecognizer.requireGestureRecognizerToFail(mySwipe) 
+0

Tout à fait d'accord que c'est la bonne solution! Je dois également ajouter dans la même ligne pour le 'pinchGestureRecognizer' pour l'obtenir pour être fiable pendant que j'essayais de détecter un glissement multi-doigt. –

+0

Cela semble définitivement être la bonne façon de procéder! Parfois, je trouve que le geste de balayage se déclenche un peu trop tôt, mais c'est maintenant un problème de gestionnaire de balayage. Au moins, nous n'avons pas à faire toutes sortes de trucs bizarres que les autres suggèrent, et juste "Se sentir mal". Merci!! – horseshoe7

+1

great Réponse de tous les temps .. :) –