UIScrollView, доступ к нижней части прокрутки

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

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

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

Ответ 1

Я думаю, что вы могли бы сделать это, чтобы проверить, что ваша точка 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
    }
}

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

Ответ 2

Итак, если вы хотите, чтобы это было быстро, вот вы:

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

Ответ 3

Я думаю, что ответ @bensnider правильный, но не слишком. Из-за этих двух причин

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

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

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

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

Я считаю, что это более точно.

Очень мало случаев, что это кодирование действительно и в два раза. Но пользователь не встретит этого.

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

    }
}

Ответ 4

Принятый ответ работает только в том случае, если нижнее значение 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
}

Ответ 5

На самом деле, вместо того, чтобы просто вводить код @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
    }
}

Ответ 6

Работает в Swift 3:

override func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.y == (scrollView.contentSize.height - scrollView.frame.size.height) {
        loadMore()
    }
}

Ответ 7

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