UIScrollView, достигнув нижней части представления прокрутки - PullRequest
36 голосов
/ 02 июня 2011

Я знаю, что в документации Apple есть следующий метод делегата:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;      // called when scroll view grinds to a halt

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

Ответы [ 7 ]

99 голосов
/ 02 июня 2011

Я думаю, что вы могли бы сделать, чтобы проверить, что ваша точка contentOffset находится внизу contentSize. Таким образом, вы могли бы сделать что-то вроде:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    float bottomEdge = scrollView.contentOffset.y + scrollView.frame.size.height;
    if (bottomEdge >= scrollView.contentSize.height) {
        // we are at the end
    }
}

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

17 голосов
/ 01 октября 2014

Итак, если вы хотите быстро, вот, пожалуйста:

override func scrollViewDidScroll(scrollView: UIScrollView) {

    if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) {
        //reach bottom
    }

    if (scrollView.contentOffset.y < 0){
        //reach top
    }

    if (scrollView.contentOffset.y >= 0 && scrollView.contentOffset.y < (scrollView.contentSize.height - scrollView.frame.size.height)){
        //not top and not bottom
    }
}
14 голосов
/ 28 июня 2013

Думаю, @bensnider ответ правильный, но не exart.По этим двум причинам

1. - (void)scrollViewDidScroll:(UIScrollView *)scrollView{}

Этот метод будет вызываться непрерывно, если мы проверим на if (bottomEdge >= scrollView.contentSize.height)

2.В этом случае, если мы пойдем на ==, проверьте также, что это условие будет действовать два раза.

  • (i), когда мы будем прокручиваться вверх, когда конец вида прокрутки касается нижнего края
  • (ii) Когда вид прокрутки отскакивает назад, чтобы сохранить свою собственную позицию

Я чувствую, что это более точно.

В очень редких случаях эта кодировка действительна и в два раза.Но пользователь с этим не столкнется.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
 {
    if (scrollView.contentOffset.y == roundf(scrollView.contentSize.height-scrollView.frame.size.height)) {
    NSLog(@"we are at the endddd");

   //Call your function here...

    }
}
9 голосов
/ 03 августа 2014

Принятый ответ работает, только если нижнее значение contentInset неотрицательно.Небольшая эволюция будет рассматривать дно contentInset независимо от его знака:

CGFloat bottomInset = scrollView.contentInset.bottom;
CGFloat bottomEdge = scrollView.contentOffset.y + scrollView.frame.size.height - bottomInset;
if (bottomEdge == scrollView.contentSize.height) {
    // Scroll view is scrolled to bottom
}
3 голосов
/ 03 декабря 2016

На самом деле, вместо того, чтобы просто помещать код @ bensnider в scrollViewDidScroll, этот код (написанный на Swift 3) будет лучше с точки зрения производительности:

func scrollViewDidEndDragging(_ scrollView: UIScrollView,
                              willDecelerate decelerate: Bool) {
    if !decelerate {
        checkHasScrolledToBottom()
    }
}

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    checkHasScrolledToBottom()
}

func checkHasScrolledToBottom() {
    let bottomEdge = scrollView.contentOffset.y + scrollView.frame.size.height
    if bottomEdge >= scrollView.contentSize.height {
        // we are at the end
    }
}
2 голосов
/ 12 января 2017

Это работает в Swift 3:

override func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.y == (scrollView.contentSize.height - scrollView.frame.size.height) {
        loadMore()
    }
}
0 голосов
/ 02 июня 2011

Посмотрите, какие элементы в данный момент отображаются в UIView, используя что-то вроде indexPathsForVisibleRows, и если ваша модель имеет больше элементов, чем отображается, поместите стрелку внизу.

...