2017-01-03 2 views
0

Meine App verwendet eine ausgelagerte horizontale Bildlaufansicht. Jede Seite hat UIControls, auf die der Benutzer tippen kann.Doppeltes UIScrollView-Abbruchverhalten mit UIPanGestureRecognizer

UIScrollView erledigt die Löschung von Berührungen und Wischen sehr gut. Wenn der Benutzer beginnt, schnell genug zu wischen, ist es immer ein Wischen. Wenn der Benutzer lange genug auflegt, um den markierten Status zu aktivieren, versucht die Bildlaufansicht nicht, zu wischen.

Ich versuche, dieses Verhalten mit einer UIPanGestureRecognizer-Unterklasse zu duplizieren, so dass ich auf Downward-Swipes innerhalb meiner Scrollview reagieren kann. Allerdings kann ich die Geste nicht abbrechen, wenn UIControls hervorgehoben wird.

Bisher habe ich folgendes getan:

self.refreshGesture.cancelsTouchesInView = YES; 
self.refreshGesture.delaysTouchesBegan = NO; 
self.refreshGesture.delaysTouchesEnded = NO; 

Dies scheint die Art und Weise UIScrollView geht berührt - Ansichten zu duplizieren, aber es dupliziert nicht die Art und Weise, dass UIScrollView pan Gestenerkenner wird abgebrochen. self.refreshGesture wird immer ausgelöst, egal wie langsam der Benutzer wischt oder wie der Status der UIControls ist.

Ich habe versucht, den Delegierten auf meine Geste zu setzen, und das könnte der Weg sein. Aber ich habe keine Kombination gefunden, die funktioniert. Zum Beispiel, nur zu überprüfen, ob die Berührung innerhalb eines UIControl startet, bricht zu häufig ab. Ich habe auch versucht, in meinen Kontrollen zu überschreiben, aber das scheint wie ein Hack und hat weitreichende Implikationen (stört beispielsweise UITextView Gesten).

In diesem GIF können Sie sehen, dass das Steuerelement bei Berührung aktiviert wird und die Bildlaufansicht den Bildlauf abbricht, wenn dies geschieht. Aber meine nach unten Pfanne Geste wird auf die gleiche Art und Weise nicht abgebrochen:

enter image description here

Antwort

0

ich nicht in der Lage war, diese genau zu kopieren, aber es gibt zwei von WWDC 2014 #235 vorgeschlagen Möglichkeiten.

  1. Fügen Sie einen transparenten Bildlauf über Ihren Hauptinhalt hinzu und verschieben Sie den Gestenerkenner in Ihre Stammansicht. Das ist was getan hat. Es ließ mich UIScrollViewDelegate verwenden, was am Ende ausreichend war.
  2. Verwenden Sie eine "Zeitüberschreitung" Gestenerkennung. Das Video schlägt vor, dass die Timeout-Geste fehlschlägt, aber in meinem Fall funktionierte es besser, eine lange Druckgeste zu verwenden und meine Schwenkbewegung abzubrechen, wenn der lange Druck ausgelöst wurde. 0,1 Sekunden schienen besser zu funktionieren als ihre empfohlenen 0,15 Sekunden.