Wie man weiß, wann UITableView im iPhone nach unten scrollte

Ich würde gerne wissen, wann ein UITableView nach unten UITableView um mehr Inhalt zu laden und UITableView , etwas wie einen Delegaten oder etwas anderes, um dem Controller mitzuteilen, wann die Tabelle nach unten geblättert hat.

Weiß jemand das, bitte hilf mir, danke im Voraus!

    Am besten testen Sie einen Punkt am unteren Bildschirmrand und verwenden diesen Methodenaufruf, wenn der Benutzer scrollt ( scrollViewDidScroll ):

     - (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point 

    Testen Sie einen Punkt in der Nähe des unteren Bildschirmrands und überprüfen Sie dann mit dem zurückgegebenen IndexPath, ob dieser IndexPfad die letzte Zeile ist. Wenn dies der Fall ist, fügen Sie Zeilen hinzu.

    in der Tabellenansicht delegiere etwas wie das

     - (void)scrollViewDidScroll:(UIScrollView *)aScrollView { CGPoint offset = aScrollView.contentOffset; CGRect bounds = aScrollView.bounds; CGSize size = aScrollView.contentSize; UIEdgeInsets inset = aScrollView.contentInset; float y = offset.y + bounds.size.height - inset.bottom; float h = size.height; // NSLog(@"offset: %f", offset.y); // NSLog(@"content.height: %f", size.height); // NSLog(@"bounds.height: %f", bounds.size.height); // NSLog(@"inset.top: %f", inset.top); // NSLog(@"inset.bottom: %f", inset.bottom); // NSLog(@"pos: %f of %f", y, h); float reload_distance = 10; if(y > h + reload_distance) { NSLog(@"load more rows"); } } 

    Modifizierte Neonees antworten ein bisschen.

    Diese Antwort richtet sich an diejenigen unter Ihnen, die nur einmal pro Fingerauslösung das Ereignis auslösen möchten .

    Geeignet, wenn mehr Inhalte von einem Content-Provider geladen werden (Web-Service, Core-Daten usw.). Beachten Sie, dass dieser Ansatz die Antwortzeit Ihres Webdienstes nicht berücksichtigt.

     - (void)scrollViewDidEndDragging:(UIScrollView *)aScrollView willDecelerate:(BOOL)decelerate { CGPoint offset = aScrollView.contentOffset; CGRect bounds = aScrollView.bounds; CGSize size = aScrollView.contentSize; UIEdgeInsets inset = aScrollView.contentInset; float y = offset.y + bounds.size.height - inset.bottom; float h = size.height; float reload_distance = 50; if(y > h + reload_distance) { NSLog(@"load more rows"); } } 

    UITableViewDelegate Sie diese Methode im UITableViewDelegate :

     -(void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat height = scrollView.frame.size.height; CGFloat contentYoffset = scrollView.contentOffset.y; CGFloat distanceFromBottom = scrollView.contentSize.height - contentYoffset; if(distanceFromBottom < height) { NSLog(@"end of the table"); } } 

    Verwendung – tableView:willDisplayCell:forRowAtIndexPath: ( UITableViewDelegate Methode)

    Vergleichen indexPath einfach den indexPath mit den Elementen in Ihrem indexPath (oder der Datenquelle, die Sie für Ihre Tabellenansicht verwenden), um herauszufinden, ob das letzte Element angezeigt wird.

    Dokumente: http://developer.apple.com/library/ios/documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UITableViewDelegate/tableView:willDisplayCell:forRowAtIndexPath :

    Keine der obigen Antworten hat mir geholfen, also kam ich auf Folgendes:

     - (void)scrollViewDidEndDecelerating:(UIScrollView *)aScrollView { NSArray *visibleRows = [self.tableView visibleCells]; UITableViewCell *lastVisibleCell = [visibleRows lastObject]; NSIndexPath *path = [self.tableView indexPathForCell:lastVisibleCell]; if(path.section == lastSection && path.row == lastRow) { // Do something here } } 

    UITableView ist eine Unterklasse von UIScrollView und UITableViewDelegate entspricht UIScrollViewDelegate . Der Delegat, den Sie an die Tabellenansicht scrollViewDidScroll: , erhält Ereignisse wie scrollViewDidScroll: und Sie können Methoden wie contentOffset in der Tabellenansicht contentOffset , um die contentOffset zu finden.

     NSLog(@"%f / %f",tableView.contentOffset.y, tableView.contentSize.height - tableView.frame.size.height); if (tableView.contentOffset.y == tableView.contentSize.height - tableView.frame.size.height) [self doSomething]; 

    Schön und einfach

    In Swift kannst du so etwas tun. Die folgende Bedingung wird jedes Mal wahr, wenn Sie das Ende der Tabellenansicht erreichen

     func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { if indexPath.row+1 == postArray.count { println("came to last row") } } 

    Aufbauend auf @Jay Mayus Antwort, die ich als eine der besseren Lösungen empfand:

    Ziel c

     // UITableViewDelegate - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { // Need to call the service & update the array if(indexPath.row + 1 == self.sourceArray.count) { DLog(@"Displayed the last row!"); } } 

    Schnell 2.x

     // UITableViewDelegate func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { if (indexPath.row + 1) == sourceArray.count { print("Displayed the last row!") } } 

    Normalerweise verwende ich dies, um mehr Daten zu laden, wenn die letzte Zelle angezeigt wird

     -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row == myDataArray.count-1) { NSLog(@"load more"); } } 

    Neoneye ausgezeichnete Antworten, aber in schnell, und Umbenennung der Variablen.

    Im Grunde wissen wir, dass wir den unteren Rand der Tabellenansicht erreicht haben, wenn yOffsetAtBottom über der Tabelleninhaltshöhe liegt.

     func isTableViewScrolledToBottom() -> Bool { let tableHeight = tableView.bounds.size.height let contentHeight = tableView.contentSize.height let insetHeight = tableView.contentInset.bottom let yOffset = tableView.contentOffset.y let yOffsetAtBottom = yOffset + tableHeight - insetHeight return yOffsetAtBottom > contentHeight } 

    Hier ist der schnelle 3.0 Versionscode.

      func scrollViewDidScroll(_ scrollView: UIScrollView) { let offset = scrollView.contentOffset let bounds = scrollView.bounds let size = scrollView.contentSize let inset = scrollView.contentInset let y: Float = Float(offset.y) + Float(bounds.size.height) + Float(inset.bottom) let height: Float = Float(size.height) let distance: Float = 10 if y > height + distance { // load more data } } 

    Meine Lösung besteht darin, Zellen hinzuzufügen, bevor Tableview beim geschätzten Offset verlangsamt wird. Es ist vorhersehbar auf Geschwindigkeit.

     - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)offset { NSLog(@"offset: %f", offset->y+scrollView.frame.size.height); NSLog(@"Scroll view content size: %f", scrollView.contentSize.height); if (offset->y+scrollView.frame.size.height > scrollView.contentSize.height - 300) { NSLog(@"Load new rows when reaches 300px before end of content"); [[DataManager shared] fetchRecordsNextPage]; } } 

    Update für Swift 3

    Neoneyees Antwort funktionierte in Objective C am besten für mich, das ist das Äquivalent der Antwort in Swift 3:

     func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { let offset: CGPoint = scrollView.contentOffset let bounds: CGRect = scrollView.bounds let size: CGSize = scrollView.contentSize let inset: UIEdgeInsets = scrollView.contentInset let y: CGFloat = offset.y + bounds.size.height - inset.bottom let h: CGFloat = size.height // print("offset: %f", offset.y) // print("content.height: %f", size.height) // print("bounds.height: %f", bounds.size.height) // print("inset.top: %f", inset.top) // print("inset.bottom: %f", inset.bottom) // print("position: %f of %f", y, h) let reloadDistance: CGFloat = 10 if (y > h + reloadDistance) { print("load more rows") } } 

    Ich möchte etwas auf meiner 1 vollen Tableviewcell durchführen.

    Also der Code ist Link der:

     -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { NSArray* cells = self.tableView.visibleCells; NSIndexPath *indexPath = nil ; for (int aIntCount = 0; aIntCount < [cells count]; aIntCount++) { UITableViewCell *cell = [cells objectAtIndex:aIntCount]; CGRect cellRect = [self.tableView convertRect:cell.frame toView:self.tableView.superview]; if (CGRectContainsRect(self.tableView.frame, cellRect)) { indexPath = [self.tableView indexPathForCell:cell]; // remain logic } } } 

    Möge dies jemandem helfen.