Domanda

Sto cercando di implementare una UIScrollView dove orizzontalmente panning, è possibile scorrere le immagini nella scrollview ma verticalmente panning compie un'altra azione che ho.Ora ho una UIScrollView che è impaginato con scorrimento verticale disabili che funziona bene per scorrendo le foto, ma sto impazzendo cercando di trovare un modo per intercettare verticale pentole e chiamare mio metodo invece di verticale padelle solo di essere divorato dal la scrollview.Sono stato in grado di fare

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

Il che mi dà il controllo totale sopra il pan nel mio handlePanGesture:metodo, ma questo non è particolarmente utile perché poi mi sento come io sono, essenzialmente, sarà la riscrittura di tutti e la logica di scorrimento che sto cercando di evitare.Qualsiasi aiuto o indicazioni su come raggiungere questo sarebbe molto apprezzato.

Grazie!

È stato utile?

Soluzione

Penso che questo sarà difficile se vuoi usare un gesto di padella a causa dell'uso della vista di scorrimento di quei gesti.Tuttavia, se è possibile utilizzare un colpo, è facile da implementare.

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

Ne ho testato questo, e ha funzionato bene per chiamare il gestore, e non è necessario disabilitare il riconoscimento di Gesture Pan View di scorrimento (nel mio test, la vista di scorrimento è stata abbastanza alta e il contenuto abbastanza corto che non c'era abbastanzaScorrimento verticale - Non so se questo è necessario o meno).

Altri suggerimenti

Come di iOS 5, UIScrollView espone i suoi UIPanGestureRecognizer.Set personalizzato, passare il dito verso il delegate per self e rendere il gestureRecognizer di un immobile o di ivar, e rendere la vostra classe è conforme alla <UIGestureRecognizerDelegate> il protocollo.Quindi, implementare UIGestureRecognizerDelegate’s – gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: in questo modo:

- (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
}

Ho aggiunto un UIPanGestureRecognizer THEN SetupgestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: come questo:

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

Ho anche aggiunto un assegno in 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;
}
.

Per utilizzare solo self.panGesture durante il panning o verso il basso.

Aggiornamento

https://stackoverflow.com/a/8603839/667834 sembra avere un metodo migliore per 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;
}
.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top