Umgang mit Berührungen für verschachtelte UIScrollViews scrollen in die gleiche Richtung
Ich habe zwei verschachtelte UIScrollViews, sowohl das scrollen in der vertikalen Richtung. Ich brauche die äußeren scrollview, um zu Blättern, um es in den max-Bereich den ersten, bevor das innere scrollview, um zu scrollen. Die innere scrollview sollte nicht Scrollbar, bis der äußere scrollview hat, erreicht es die max-Bereich. Hier ist eine illustration:
Im linken Diagramm eine vertikale ziehen Sie innerhalb von Scrollview B
bewegen sollte Scrollview A
und Scrollview B
sollte nicht Scrollbar (aber es muss noch in der Lage sein zu erhalten, berührt/Hähne). Einmal Scrollview A
erreicht es ist maximale Strecke (wenn Scrollview B
bekommt, um die oben auf dem Bildschirm), dann Scrollview B
scrollen soll. Diese arbeiten muss in einer kontinuierlichen Bewegung.
Habe ich versucht zu wechseln ScrollView B
's scrollEnabled
aus ScrollView A
's scrollViewDidScroll:
delegate-Methode, aber das scheint keine praktikable Lösung, weil es nicht Arbeit in eine kontinuierliche Bewegung (zB: Der Benutzer muss loslassen und wieder Anfassen, nachdem Scrollview B
erreicht den oberen Rand des Bildschirms).
Was ist der beste Weg, um dies zu implementieren, so dass Werke in einer kontinuierlichen Bewegung?
- Konnte Sie ein transparent, Geschwister-anzeigen auf der Oberseite des scrollViews und verwenden Sie es zum abfangen von gesten. Dann leiten Sie Sie zu einer scrollView oder der anderen, je nachdem, wie weit Sie haben jeweils gescrollt werden. Oder -- eine komplett andere Idee: ich Wette, es gibt einige Möglichkeit, es zu tun mit klugen autolayout-constraints...
- Der schwierige Teil über die overlay-Strategie ist, dass Scrollview B noch braucht, um zu akzeptieren berührt (zB: auf eine Schaltfläche zu Tippen). Also nur die Weiterleitung alle berührt, je nach der scrollview position nicht funktionieren würde.
- Eine andere Idee: Sie können verhindern, dass ein scrollView Bildlauf durch die Einstellung seiner contentOffset auf einen Konstanten Wert im layoutSubviews. Sie könnten, zu stoppen B von scrollen, bis es an der richtigen position mit Bezug auf A., die nicht den Delegaten problem-Sie brauchen nicht zu warten, für den Bildlauf zu beenden, bevor Sie die contentOffset.
- machen Sie endlich die Lösung für dieses problem
- wird keine Lösung gefunden?? :<
- Hast du irgendeine Lösung für dieses problem ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich löste das problem in der folgenden Weise. Ich bin nicht wirklich zufrieden, da es sieht für mich viel zu kompliziert, aber es funktioniert (bitte beachten Sie, dass der folgende code ist eine vereinfachte, noch ungetestete version von meinem code, das ist aufgrund der unterschiedlichen UI komplizierter):
Ich habe 3 Eigenschaften, die Steuern, scrollen:
2-Schritt-scrolling:
Deaktivieren Sie Bildlauf für B, und aktivieren Sie scrollen für A.
Dies ermöglicht das scrollen Ein .
Wenn Eine erreicht seine maximale position, deaktivieren Sie Bildlauf für Ein, und aktivieren Sie scrollen für B:
Liefert das die folgende Wirkung:
Wenn Ein Bildlauf durchgeführt wird, nach oben wird es stoppen, wenn seine maximale Größe erreicht ist. Aber B wird nicht starten, scrollen, da die pan-Geste Erkennung Eines nicht leitet Ihre Handlungen in die Pfanne gestik-Erkennung von B. Damit hat man zu heben den finger und starten Sie einen 2. scrollen. Dann, B-Rolle. Dies gibt die 2-step zu scrollen.
Kontinuierliche scrollen:
Für die kontinuierliche scrollen, B muss scrollen, während die finger, die begannen, scrollen von Einem weiterhin nach oben bewegen. Um dies zu erkennen, habe ich eine weitere Hinzugefügt pan gesture recognizer tho Ein, und ermöglichte es zu erkennen, gesten gleichzeitig mit der integrierten gesture recognizers von A und B:
In der Handlung dieser zusätzliche pan gesture recognizer, berechne ich den Abstand der finger nach oben bewegt, nachdem die Scroll-Grenze für erreicht wurde. Durch diesen Abstand B wird dann gescrollt programmatisch:
Gibt es noch einen Nachteil:
Wenn Sie anfangen zu scrollen, heben Sie den finger, und lassen Sie die scrollView verlangsamen, er wird sich Verhalten wie das 2-Stufen-scrolling, da die zusätzlichen pan gesture recognizer nicht erkennen, die pan-Geste.
In meinem Fall habe ich gelöst Unterklassen UIScrollView für die äußeren ScrollView.
Ihre Forderung, dass diese Arbeit sollte in einer kontinuierlichen Bewegung ruft die Antwort: Sie müssen nur eine UIScrollView, nicht zwei.
Wenn Sie nur ein scrollview Sie können dann Ihre Magie durch überschreiben der scrollview ist
layoutSubviews
Methode und rejigging seinen Inhalt, um Ihre Parallaxe-Effekt, basierend auf dem aktuellen Wert voncontentOffset
. Stellen Sie sicher, dasscontentSize
unbedingt die volle Höhe (Sie können sogar zu aktualisieren contentSize innen layoutSubviews, wenn es sein muss).Für eine Architektur, Ihre vorhandenen Diagramm und ersetzen Sie einfach Scrollview B mit Blick B.
frame
s in IhrerlayoutSubviews
Methode. Insbesondere würde dies attraktiv sein, wenn es funktionierte für verschachtelteUICollectionView
Instanzen. Meine Vermutung ist, dass es nicht funktionieren würde, aber es wäre schön. Wahrscheinlich könnte es einrichten mit layout-constraints zu.NestedScrollViewHostView
enthalten würde einescollView
Instanz. Es istlayoutSubviews
Methode suchen die responder-Kette zu finden, die meisten top -UIScrollView
, pick-up-Rahmen, wandeln diese in lokalen Koordinaten, und wenden Sie es auf die enthaltenenUIScrollView
Kind (das könnte eine Sammlung oder Liste anzeigen, natürlich). Hinzufügen derscrollView
würde ausschalten des Kindes zu scrollen. Dies würde es ermöglichen, Schachteln einerUICollectionView
imUICollectionView
zu sein, und das Kind nur anlegen, Zellen, als Sie sichtbar werden.Gestik-Erkennung für scroll-view Einen brauchen würde, um pass off, um die gestik-Erkennung für scroll-view B zu haben, auf die kontinuierliche Bewegung, die ich bin ziemlich sicher, dass ist nicht möglich. Warum kombinieren Sie nicht den Inhalt der beiden scroll-Ansichten statt und dann hätte man eine kontinuierliche Bewegung. Dieser code wird kombinieren den Inhalt der scrollView A und B in A.
Gleichen Richtung Scrollen
Gleiche Richtung scrollen tritt auf, wenn ein
UIScrollView
ist eine Untersicht einesUIScrollView
beiden Blättern in die gleiche Richtung. Dies ist gezeigt in der linken Abbildung.Folgen Sie diesem link, wenn Sie möchten, schauen Sie sich in details https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/UIScrollView_pg/NestedScrollViews/NestedScrollViews.html
Nur einige Attribute, die erwähnt werden im Bild oben. es funktioniert.
panGestureRecognizer
.