33

Ich habe eine vertikal scrollende UIScrollView. Ich möchte auch horizontale Schwenks darauf behandeln und gleichzeitig das standardmäßige vertikale Scroll-Verhalten zulassen. Ich habe eine transparente UIView über die Bildlaufansicht gelegt und eine Schwenkgeste Erkenner hinzugefügt. Auf diese Weise kann ich die Pfannen gut erhalten, aber dann erhält die Scroll-Ansicht keine Gesten.Pan Gesten über eine UIScrollView abbrechen bricht Scrollen

Ich habe folgende UIPanGestureRecognizerDelegate Methoden implementiert, in der Hoffnung meine Gestenerkenner auf Horizontalschwenks nur zu begrenzen, aber das half auch nicht:

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

Haben Sie versucht, '[panGesture setCancelsTouchesInView: NO];'? Wenn Sie einfach YES in 'shouldRecognizeSimultelyWithGestureRecognizer' zurückgeben, können Sie auch herausfinden, wo das Problem liegt. –

+0

Habe es einfach ausprobiert, kein Unterschied. – Macondo2Seattle

Antwort

33

OK, ich es herausgefunden. Ich musste zwei Dinge tun, um dies zu erreichen:

1) Befestigen Sie meine eigene Pan Recognizer auf die Bildlaufansicht selbst, nicht auf eine andere Ansicht darüber.

2) Diese UIGestureRecognizerDelegate Methode verhindert das dümmliche Verhalten, das passiert, wenn sowohl die Standard-Scrollansicht als auch meine eigene gleichzeitig aufgerufen werden.

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

das Standardverhalten von shouldRecognizeSimultouslyWithGestureRecognizer ist, NEIN zurückzugeben, so dass add nicht benötigt –

+4

den Rückgabewert zu 'YES' ändern und es funktioniert super. –

11

Ich hatte das gleiche Problem, diese zu lösen, und ich tat:

1) meine eigene pan-Erkenner auf die Bildlaufansicht anhängen.

2) Zurück JA on: - GestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer:

Dies wird beide Gesten einwirken lassen. Das bedeutet also, dass beim vertikalen Scrollen sowohl Ihr panGesture-Delegat als auch Ihr scrollView-Delegierter ausgelöst wird. Wenn es sich um einen horizontalen Bildlauf handelt, wird nur Ihr panGesture-Delegat aufgerufen.

3) in meinem panGesture Delegat, erkennen, ob es eine horizontale Scroll ist, wenn es nicht ist, ignorieren.

+1

Dies ist genau das gleiche, das ich in meiner eigenen Antwort empfehle. – Macondo2Seattle

+11

@BlackRider ist es nicht. Dies gibt YES –

+0

Dank 'GestenRecognizer: sollteRecognizeSimultanelyWithGestureRecognizer' den Trick. – atulkhatri

0

Swift Antwort:

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 
    } 
} 
Verwandte Themen