Question

Je tente de mettre en œuvre un UIScrollView où panoramique horizontale permet de faire défiler les photos dans la scrollview mais verticalement panoramique effectue une autre action que j'ai.Droit maintenant, j'ai un UIScrollView qui est paginé avec le défilement vertical personnes handicapées, qui fonctionne très bien pour faire défiler des photos, mais je suis allez fou en essayant de trouver un moyen d'intercepter verticale de casseroles et d'appeler mon propre méthode au lieu de la verticale casseroles juste d'être mangé par le scrollview.J'ai été en mesure de le faire

    UIPanGestureRecognizer *panUp = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
[self.scrollView addGestureRecognizer:panUp];
[scrollView.panGestureRecognizer setEnabled:NO];

Ce qui me donne un contrôle total sur la balance dans mon handlePanGesture:la méthode, mais ce n'est pas particulièrement utile parce que je me sens comme je suis essentiellement va être réécriture de la vitesse de défilement de la logique que je tente d'éviter.Toute aide ou des conseils sur la façon d'atteindre ce serait grandement apprécié.

Merci!

Était-ce utile?

La solution

Je pense que cela sera difficile si vous souhaitez utiliser un geste de panoramique en raison de l'utilisation de ces gestes de la vue de défilement.Cependant, si vous pouvez utiliser un balayage, il est facile à mettre en œuvre.

    UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
    swipe.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp;
    [self.scrollView addGestureRecognizer:swipe];

J'ai testé cela, et cela a fonctionné bien pour appeler le gestionnaire, et vous n'avez pas besoin de désactiver le reconnaissement de gestes pan-gestes de la vue de défilement (dans mon test, la vue de défilement était assez grande et le contenu suffisamment court qu'il n'y avait pas deDéfilement vertical - Je ne sais pas si cela est nécessaire ou non).

Autres conseils

Comme d'iOS 5, UIScrollView expose ses UIPanGestureRecognizer.Ensemble personnalisé de votre balayage de l' delegate pour self et de faire de la gestureRecognizer une propriété ou d'ivar, et faire de votre classe sont conformes à la <UIGestureRecognizerDelegate> le protocole.Ensuite, mettre en œuvre UIGestureRecognizerDelegate’s – gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: comme suit:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if ([gestureRecognizer isEqual:self.swipe] && [otherGestureRecognizer isEqual:self.scrollView.panGestureRecognizer])
    {
         return NO;
    }
    return YES; // the default for this method
}

J'ai ajouté un UIPanGestureRecognizer puis le programme d'installationgestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: comme ceci:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    if ([gestureRecognizer isEqual:self.panGesture] && [otherGestureRecognizer isEqual:self.collectionView.panGestureRecognizer]){
        return YES;
    }
    return NO;
}

J'ai aussi ajouté un chèque en gestureRecognizerShouldBegin:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if ([gestureRecognizer isEqual:self.panGesture]) {
        if (gestureRecognizer.numberOfTouches > 0) {
            CGPoint point = [gestureRecognizer locationOfTouch:0 inView:gestureRecognizer.view];
            CGFloat distX = abs(self.collectionView.lastTouchPos.x - point.x);
            CGFloat distY = abs(self.collectionView.lastTouchPos.y - point.y);
            if (distX > distY) {
                return NO;
            }
        } else {
            return NO;
        }
    }
    return YES;
}

à utiliser uniquement self.panGesture lors d'un panoramique vers le haut ou vers le bas.

Mise à jour

https://stackoverflow.com/a/8603839/667834 semble avoir une meilleure méthode pour gestureRecognizerShouldBegin

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if ([gestureRecognizer isEqual:self.panGesture]) {
        if (gestureRecognizer.numberOfTouches > 0) {
            CGPoint translation = [self.panGesture velocityInView:self.collectionView];
            return fabs(translation.y) > fabs(translation.x);
        } else {
            return NO;
        }
    }
    return YES;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top