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

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

Ответы [ 17 ]

5 голосов
/ 21 декабря 2016

Вот код версии swift 3.0.

   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
        }
    }
5 голосов
/ 30 сентября 2016

Принимая neoneye отличные ответы, но быстро и переименовывая переменные ..

В основном мы знаем, что достигли нижней части таблицы, если yOffsetAtBottom находится за пределамивысота содержимого таблицы.

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
}
5 голосов
/ 26 ноября 2014

Я обычно использую это, чтобы загрузить больше данных, когда последняя ячейка начинает отображаться

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   if (indexPath.row ==  myDataArray.count-1) {
        NSLog(@"load more");
    }
}
3 голосов
/ 05 апреля 2015

Мое решение состоит в том, чтобы добавить ячейки до того, как табличное представление замедлится на расчетном смещении. Это предсказуемо по скорости.

- (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];
    }
}
3 голосов
/ 18 января 2017

Обновление для Swift 3

Ответ Neoneye работал лучше всего для меня в Задаче C, это эквивалентно ответу в Swift 3:

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    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")
    }
}
2 голосов
/ 18 апреля 2014

Я хочу выполнить какое-нибудь действие с моей 1 полной Tableviewcell.

Таким образом, код является ссылкой:

-(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
        }
     }
}

Может это кому-нибудь помочь.

0 голосов
/ 13 февраля 2019

@ ответ neoneye работал для меня.Вот Swift 4 версия этого

    let offset = scrollView.contentOffset
    let bounds = scrollView.bounds
    let size = scrollView.contentSize
    let insets = scrollView.contentInset
    let y = offset.y + bounds.size.height - insets.bottom
    let h = size.height
    let reloadDistance = CGFloat(10)
    if y > h + reloadDistance {
        //load more rows
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...