UICollectionView + AFNetworking + AutoScroll / Paginierung?

8

Ich benutze UICollectionView + AFNetworking 2 um Bilder asynchron von einem Webservice zu laden. Es funktioniert großartig. Wie implementiere ich jedoch das automatische Scrollen (wenn der Benutzer den unteren Rand der Seite erreicht oder in dessen Nähe, wird die API aufgerufen, um mehr Zellen zu holen).

Ich habe viele Beispiele gesehen, aber es scheint keine Best Practice zu geben. Zum Beispiel schlug ein Tutorial scrollViewDidScroll vor, das aber jedes Mal aufgerufen wird, wenn die Ansicht gescrollt wird. Ist das die richtige Umsetzung?

PS. Ich schreibe in Swift.

Hier ist mein Code zur Zellenerstellung:

%Vor%     
Dean 14.07.2014, 23:56
quelle

4 Antworten

3

Sie könnten dies in einer scrollViewDidScroll -Delegatenmethode oder collectionView:cellForItemAtIndexPath: tun (hier könnten Sie feststellen, dass die letzte Zelle geladen wird). Was Sie tun müssten, ist einen Wrapper für AFNetworking call zu erstellen, um zu verhindern, dass die Daten einige Male geladen werden (irgendeine Art von Flag, die anzeigt, dass sie bereits geladen wird).

Danach können Sie eine zusätzliche Zelle mit einer Art Aktivitätsanzeige am unteren Rand einfügen und sie entfernen, nachdem AFNetworking call beendet ist.

    
blazejmar 19.07.2014, 16:03
quelle
1

Sie sollten die delegemethode willEndDragging UIScrollview verwenden, um zu bestimmen, wo der scrollview den Bildlauf stoppt. - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset

Dies hat mehrere Vorteile gegenüber den anderen Methoden:

  1. didScroll wird jedes Mal aufgerufen, wenn der scrollview - auch nur teilweise - scrollt, selbst wenn Sie ihn aus dem Code auslösen. Ich habe gesehen, dass didScroll auch bei einer bounds-Änderung aufgerufen wird, etwa wenn sich die Ausrichtung ändert, gerade auf dem iPad. Es wird nur zu oft aufgerufen!
  2. didEndDecelerating wird möglicherweise nicht aufgerufen, wenn die scrollview plötzlich abbricht - etwa wenn der Benutzer die scrollview drückt und hält, während sie langsamer wird
  3. willEndDragging wird nur aufgerufen, wenn user Ihre Bildlaufansicht scrollt und nicht nach Code- / Layoutänderungen.

Verwenden Sie im WillEndDragging den Inhaltsoffset target , um festzustellen, ob mehr Ergebnisse geladen werden müssen. Sobald Ihre API mit dem Abrufen von Daten fertig ist, rufen Sie reloadData einfach in der Sammlungsansicht auf und die neuen Ergebnisse werden angezeigt. Beachten Sie, dass das Ziel contentOffset ein Zeiger ist. Sie müssen daher targetContentOffset->y verwenden, um die Zielposition y zu erhalten.

Der eigentliche Code dafür wird von der Implementierung abhängig sein, also gebe ich kein Beispiel ein, aber es sollte einfach genug sein, um zu kodieren.

    
Dhiraj Gupta 26.07.2014 14:30
quelle
0

Ja, verwenden Sie scrollViewDidScroll , um zu prüfen, ob Sie sich am Ende befinden, als die Arbeit auszuführen, die Sie benötigen (Ladeprogramm platzieren, Daten laden usw.).

Sie können die fertige Komponente SVInfiniteScrolling verwenden (die Teil von SVPullToRefresh ist). Oder schauen Sie sich die Implementierung an , um inspiriert zu werden.

Glückliche Kodierung!

    
Anton Gaenko 22.07.2014 08:25
quelle
0

Ich verwende diesen Code in meinem Projekt. Ich habe es mit Obj-C geschrieben und weiß nicht genug, um es in Swift umzuwandeln. Wenn Sie also konvertieren können, können Sie selbst feststellen, ob der Benutzer das Ende der Seite erreicht hat;

%Vor%     
Kemal Can Kaynak 22.07.2014 14:42
quelle