Как узнать, когда UITableView прокручивается в нижней части iPhone - PullRequest
96 голосов
/ 28 февраля 2011

Я хотел бы знать, когда UITableView прокрутил вниз, чтобы загрузить и показать больше контента, что-то вроде делегата или что-то еще, чтобы сообщить контроллеру, когда таблица прокрутилась вниз.1003 * Кто-нибудь знает это, пожалуйста, помогите мне, спасибо заранее!

Ответы [ 17 ]

244 голосов
/ 12 апреля 2011

в делегате просмотра таблицы сделайте что-то вроде этого

ObjC:

- (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");
    }
}

Swift:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let offset = scrollView.contentOffset
    let bounds = scrollView.bounds
    let size = scrollView.contentSize
    let inset = scrollView.contentInset
    let y = offset.y + bounds.size.height - inset.bottom
    let h = size.height
    let reload_distance:CGFloat = 10.0
    if y > (h + reload_distance) {
        print("load more rows")
    }
}
61 голосов
/ 25 июля 2013

Модифицированные neoneyes отвечают немного.

Этот ответ нацелен на тех из вас, кто хочет, чтобы событие вызывалось только один раз за каждое нажатие пальца .

Подходит для загрузки большего количества контента от какого-либо провайдера контента (веб-сервис, основные данные и т. Д.). Обратите внимание, что этот подход не учитывает время ответа вашего веб-сервиса.

- (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");
    }
}
38 голосов
/ 09 мая 2012

добавить этот метод в 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");
    }
}
19 голосов
/ 08 июля 2012

Используйте – tableView:willDisplayCell:forRowAtIndexPath: (UITableViewDelegate метод)

Просто сравните indexPath с элементами в вашем массиве данных (или любом другом источнике данных, который вы используете для представления таблицы), чтобы выяснить, является ли последнийэлемент отображается.

Документы: http://developer.apple.com/library/ios/documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UITableViewDelegate/tableView:willDisplayCell:forRowAtIndexPath:

19 голосов
/ 29 февраля 2012

Ни один из приведенных выше ответов не помог мне, поэтому я придумал следующее:

- (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
    }
}
17 голосов
/ 28 февраля 2011

Лучший способ - проверить точку внизу экрана и использовать этот метод, когда пользователь прокручивает (scrollViewDidScroll):

- (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point

Проверьте точку в нижней части экрана, а затем с помощью indexPath она возвращает проверку, является ли этот indexPath последней строкой, а затем, если она есть, добавьте строки.

13 голосов
/ 28 февраля 2011

UITableView является подклассом UIScrollView, а UITableViewDelegate соответствует UIScrollViewDelegate. Таким образом, делегат, прикрепленный к табличному представлению, получит такие события, как scrollViewDidScroll:, и вы можете вызвать такие методы, как contentOffset в табличном представлении, чтобы найти позицию прокрутки.

8 голосов
/ 30 июня 2015

в Swift вы можете сделать что-то вроде этого.Следующее условие будет выполняться каждый раз, когда вы достигнете конца таблицы

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        if indexPath.row+1 == postArray.count {
            println("came to last row")
        }
}
8 голосов
/ 22 ноября 2013
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];

Красиво и просто

6 голосов
/ 18 мая 2016

Опираясь на ответ @Jay Mayu, который я чувствовал, было одним из лучших решений:

Objective-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!");
  }
}

Swift 2.x

// UITableViewDelegate
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    if (indexPath.row + 1) == sourceArray.count {
        print("Displayed the last row!")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...