Ich verwende zum UICollectionView
ersten Mal in meiner iPad-Anwendung. Ich habe so eingestellt UICollectionView
, dass Größe und Zellengröße gleich sind, dh nur einmal eine Zelle gleichzeitig angezeigt wird.
Problem: Wenn der Benutzer jetzt UICollectionView scrollt, muss ich wissen, welche Zelle sichtbar ist. Ich muss andere UI-Elemente bei Änderungen aktualisieren. Ich habe dafür keine Delegatenmethode gefunden. Wie kann ich das erreichen?
Code:
[self.mainImageCollection setTag:MAIN_IMAGE_COLLECTION_VIEW];
[self.mainImageCollection registerClass:[InspirationMainImageCollectionCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
[self.mainImageFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
[self.mainImageFlowLayout setMinimumInteritemSpacing:0.0f];
[self.mainImageFlowLayout setMinimumLineSpacing:0.0f];
self.mainImageFlowLayout.minimumLineSpacing = 0;
[self.mainImageCollection setPagingEnabled:YES];
[self.mainImageCollection setShowsHorizontalScrollIndicator:NO];
[self.mainImageCollection setCollectionViewLayout:self.mainImageFlowLayout];
Was ich versucht habe:
Als UICollectionView
konform zu UIScrollView
, bekam ich, wenn der Benutzer- Bildlauf mit der UIScrollViewDelegate
Methode endet
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
Aber wie kann ich innerhalb der obigen Funktion den aktuellen Index der sichtbaren Zellen von UICollectionView
???
ios
objective-c
ipad
uicollectionview
Irfan DÄNISCH
quelle
quelle
Antworten:
Die Methode [collectionView sichtbare Zellen] gibt Ihnen alle gewünschten sichtbaren Zellen Array. Verwenden Sie es, wenn Sie erhalten möchten
Update auf Swift 5:
quelle
scrollViewDidScroll:
Delegate-Methode bietet Aktualisierungen der Bildlaufansicht, wenn ein Bildlauf beendet ist (und ist hier wahrscheinlich die bessere Wahl). Im Gegensatz zurscrollViewDidEndDecelerating:
Delegate-Methode, die nur aufgerufen wird, wenn die Bildlaufansicht " zum Stillstand kommt [von einem großen Bildlauf ]] " (siehe UIScrollView-Header)...DidScroll
wird auch während einer kurzen Schriftrolle oft aufgerufen. Kann eine gute Sache sein oder auch nicht, je nachdem, was man tun möchte.indexPathsForVisibleItems
funktioniert möglicherweise in den meisten Situationen, gibt jedoch manchmal ein Array mit mehr als einem Indexpfad zurück und es kann schwierig sein, den gewünschten Pfad zu finden. In diesen Situationen können Sie Folgendes tun:Dies funktioniert besonders gut, wenn jedes Element in Ihrer Sammlungsansicht den gesamten Bildschirm einnimmt.
Schnelle Version
quelle
visibleIndexPath
manchmal Null sein, alsoif (visibleIndexPath) == nil { let cells = collectionView.visibleCells() let visibleIndexPath = collectionView.indexPathForCell(cells[0] as! UICollectionViewCell)! as NSIndexPath }
Swift 5 :
In Swift 2.2 kombinierte Arbeitsantworten:
quelle
Der Vollständigkeit halber ist dies die Methode, die für mich funktioniert hat. Es war eine Kombination der Methoden von @Anthony & @ iAn.
quelle
Es ist wahrscheinlich am besten, UICollectionViewDelegate-Methoden zu verwenden: (Swift 3)
quelle
didEndDisplaying
, von der Dokumentation: Teilt dem Delegierten , dass die angegebene Zelle aus der Sammlung Ansicht entfernt wurde. Verwenden Sie diese Methode, um zu erkennen, wann eine Zelle aus einer Sammlungsansicht entfernt wird, anstatt die Ansicht selbst zu überwachen, um festzustellen, wann sie verschwindet. Ich glaube also nicht, dassdidEndDisplaying
aufgerufen wird, wenn die Zelle angezeigt wird.Ich möchte nur für andere hinzufügen: Aus irgendeinem Grund habe ich die Zelle, die für den Benutzer sichtbar war, nicht erhalten, als ich mit pagingEnabled zur vorherigen Zelle in collectionView gescrollt habe.
Also füge ich den Code in dispatch_async ein, um ihm etwas "Luft" zu geben, und das funktioniert für mich.
quelle
DispatchQueue.main.async {
Wenn der Anruf von so etwas wiefunc tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
willDisplay cell
wie oben erwähnt initiiert . Ich denke, das Problem irgendwo in UIKit ist in meinem Fall wirklich dasselbe wie diese Antwort.quelle
Swift 3.0
Einfachste Lösung, mit der Sie indexPath für sichtbare Zellen erhalten.
gibt das Array des Indexpfads zurück.
Nehmen Sie einfach das erste Objekt aus diesem Array.
Ich denke, es sollte auch mit Objective - C gut funktionieren.
quelle
UICollectionView aktueller Index der sichtbaren Zellen: Swift 3
quelle
Die Konvertierung von @ Anthonys Antwort auf Swift 3.0 hat für mich perfekt funktioniert:
quelle
Sie können
scrollViewDidEndDecelerating
: dafür verwendenquelle
Das ist eine alte Frage, aber in meinem Fall ...
quelle
Überprüfen Sie auch dieses Snippet
quelle
In diesem Thread gibt es so viele Lösungen, die gut funktionieren, wenn die Zelle im Vollbildmodus angezeigt wird, aber die Grenzen der Sammlungsansicht und die Mittelpunkte von Visible Rect verwenden. Es gibt jedoch eine einfache Lösung für dieses Problem
Auf diese Weise können Sie den Indexpfad der sichtbaren Zelle abrufen. Ich habe DispatchQueue hinzugefügt, weil, wenn Sie schneller wischen und für einen kurzen Moment die nächste Zelle angezeigt wird, ohne dispactchQueue der Indexpfad der kurz angezeigten Zelle angezeigt wird, nicht die Zelle, die auf dem Bildschirm angezeigt wird.
quelle
versuchen Sie dies, es funktioniert. (Im folgenden Beispiel habe ich zum Beispiel 3 Zellen.)
quelle
Swift 3 & Swift 4:
Wenn Sie die tatsächliche Anzahl anzeigen möchten, können Sie +1 hinzufügen
quelle