Ich habe eine UICollectionView
eingerichtet in einem normalen UIViewController
, die Ansicht soll zwei verschiedene Arten von Daten/Zellen zeigen, basierend auf einer Eigenschaft, die durch eine Schaltfläche umgeschaltet wird. Die Datenquelle bleibt immer gleich, sie wird nur bei jedem Tippen neu gefüllt.UICollectionView contentOffset falsch
Immer wenn die Schaltflächenaktion ausgelöst wird, wird das Hauptdatenquellenarray geleert und aufgefüllt und -reloadData
in der Sammlungsansicht aufgerufen. Dies funktioniert gut und es gibt kein unerwartetes Verhalten.
Jetzt ist das Problem, die Scroll-Position, a.k.a. contentOffset
, bleibt gleich nach dem Ändern des Filters. Nehmen wir also an, in der Sammlungsansicht würden Zellen vom Typ A
angezeigt. Ich würde schnell scrollen, auf die Schaltfläche tippen und sehen, dass die Zellen den Typ B
ändern, aber weiterhin scrollen. Der Benutzer müsste wiederholt zu seiner letzten Position zurückrollen, wenn sie sich daran erinnern können.
Ich habe versucht, dies zu lösen, indem ich eine scrollPositions
NSMutableDictionary
als eine Eigenschaft in meinem View-Controller. Die Schlüssel stellen den Filtertyp dar (A
oder B
), und die Werte stellen die y-Koordinate des aktuellen Inhaltsoffsets dar (dies ist eine vertikal gescrollete Sammlungsansicht).
Das Problem, das ich angetroffen habe, ist, dass, obwohl dies zu einem gewissen Grad zu funktionieren scheint, die contentOffset
Eigenschaft zufällig um eine bestimmte Anzahl von Pixeln ausgeschaltet ist, manchmal ist es nur ein Dutzend oder so, und manchmal ist es eine halbe Bildschirm ist wert.
Hier ist, was ich bisher ausprobiert habe:
- Capturing
bounds
statt - einstellen
edgesForExtendedLayout
automaticallyAdjustsScrollViewInsets
-NO
- Erinnerung an den aktuell sichtbaren Indexpfad einstellen, aber dies scheint falsch zu sein zu Zeiten auch
- Aufruf
-invalidateLayout
auf der Sammlungsansicht und-layoutIfNeeded
in der Elternansicht vor dem Erfassen des Offsets und vor der Wiederherstellung - Gerade hochschalten auf
UIPageViewController
und mit einemUIViewController
mit einemUICollectionView
für jeden anderen Filter, aber das brachte eine ganze Reihe weiterer Probleme.
Aber leider, egal was ich versuche, ich am Ende immer mit den gleichen Ergebnissen. Wenn ich zum vorher eingestellten Filter zurückkehre, wird wieder der zuvor aufgenommene Offset angezeigt, der fast dort ist, wo ich aufgehört habe, aber nicht ganz. Ich bin ganz ehrlich bei mir hier, jemand hat noch mehr Vorschläge?
AUCH, wenn es darauf ankommt, dies alles mit Autolayout eingerichtet ist, und haben einige schlechte Erfahrungen mit Vanille UIScrollView
s und Autolayout in der Vergangenheit hatten. Vielleicht wurden einige der Probleme möglicherweise vererbt?
Vielen Dank für Ihre Antwort. Ich hätte angeben sollen, dass ich versucht habe, auch das Scrollen zu deaktivieren. Warten Sie außerdem einige Sekunden, bevor Sie den Filter ändern, in der Hoffnung, dass die Sammlungsansicht ihre Logik intern auflösen und ihre Offset-Eigenschaft aktualisieren kann. Das Szenario, das ich vorgeschlagen habe, wo der Benutzer beim Scrollen Tabs wechselt, ist nicht der Kern dieses Problems. Eher die Ungenauigkeit der 'contentOffset'-Eigenschaft. –