33

Ho uno scorrimento verticale UIScrollView. Voglio anche gestire le pentole orizzontali su di esso, pur consentendo il comportamento di scorrimento verticale predefinito. Ho inserito un trasparente UIView sulla vista di scorrimento e aggiunto un indicatore di movimento panoramico. In questo modo posso ottenere le pentole bene, ma poi la vista di scorrimento non riceve alcun gesto.Intercettazione di movimenti di panoramica su un UIScrollView interruzioni di scorrimento

Ho implementato i seguenti UIPanGestureRecognizerDelegate metodi, sperando di limitare il mio gesto riconoscitore al solo pentole orizzontali, ma che non ha aiutato:

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer 
{ 
    // Only accept horizontal pans here. 
    // Leave the vertical pans for scrolling the content. 
    CGPoint translation = [gestureRecognizer translationInView:self.view]; 
    BOOL isHorizontalPan = (fabsf(translation.x) > fabsf(translation.y)); 
    return isHorizontalPan; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return (otherGestureRecognizer == _scrollView.panGestureRecognizer); 
} 
+1

Hai provato '[panGesture setCancelsTouchesInView: NO];'? Il semplice ritorno di YES in 'shouldRecognizeSimultaneouslyWithGestureRecognizer' potrebbe aiutarti a capire dove si trova il problema. –

+0

Ho appena provato, nessuna differenza. – Macondo2Seattle

risposta

33

OK, ho capito. Avevo bisogno di fare 2 cose per fare in modo che funzionasse:

1) Allegare il mio riconoscitore di pan alla vista di scorrimento stessa, non a un'altra vista su di essa.

2) Questo metodo UIGestureRecognizerDelegate impedisce il comportamento sciocco che si verifica quando vengono richiamati sia la vista di scorrimento predefinita sia la mia.

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return YES; 
} 
+2

il comportamento predefinito di shouldRecognizeSimultaneouslyWithGestureRecognizer consiste nel restituire NO, in modo che l'aggiunta non sia necessaria –

+4

modificare il valore restituito in 'SÌ' e funziona benissimo. –

11

ho avuto lo stesso problema da risolvere e ho fatto questo:

1) Fissare la mia riconoscitore padella alla vista di scorrimento.

2) Ritorno SI on: - gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer:

Questo permetterà entrambi i gesti di lavorare. Quindi, ciò significa che sullo scroll verticale verranno sparati sia il delegato di panGesture che il delegato scrollView. Se si tratta di uno scroll orizzontale, chiamerà solo il tuo delegato di panGesture.

3) nel mio delegato di PanGesture, rilevare se si tratta di uno scorrimento orizzontale, se non lo è, ignorare.

+1

Questo è esattamente lo stesso che consiglio nella mia risposta. – Macondo2Seattle

+11

@BlackRider non lo è. Questo restituisce SI –

+0

Grazie a "gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer' ha fatto il trucco. – atulkhatri

0

risposta Swift:

let scrollViewPanGesture = UIPanGestureRecognizer(target: self, action: #selector(onPan(_:))) 
scrollViewPanGesture.delegate = self 
scrollView.addGestureRecognizer(scrollViewPanGesture) 

extension ViewController: UIGestureRecognizerDelegate { 
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
     return true 
    } 
}