2017-08-02 2 views
0

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 scrollPositionsNSMutableDictionary 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 einem UIViewController mit einem UICollectionView 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?

Antwort

0

Ihre Lösung mit NSMutableDictionary sollte funktionieren, denken Sie daran, das Scrollen beim Filterwechsel zu stoppen, damit Sie die größtmögliche Genauigkeit beim Offset haben. Um das aktuelle Scrollen zu stoppen:

collectionView.isScrollEnabled = false 

Dann aktivieren Sie es zurück.

collectionView.isScrollEnabled = true 
+0

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. –

Verwandte Themen