Обнаружение нижней части UIScrollview

У меня есть UIScrollView с изображениями, и когда пользователь прокручивает до конца scrollview, я хочу обновить содержимое. Это мой код, чтобы определить, когда достигается нижняя часть прокрутки:

Код ниже реализован в scrollViewDidScroll: delegate

CGFloat scrollViewHeight = imagesScrollView.bounds.size.height;
CGFloat scrollContentSizeHeight = imagesScrollView.contentSize.height;
CGFloat bottomInset = imagesScrollView.contentInset.bottom;
CGFloat scrollViewBottomOffset = scrollContentSizeHeight + bottomInset - scrollViewHeight;

if(imagesScrollView.contentOffset.y > scrollViewBottomOffset){


    [imagesView addSubview:imagesBottomLoadingView];

    [self downloadImages];

}

Моя проблема в том, что когда пользователь прокручивается вниз, моя функция вызывается несколько раз, но я хочу называть ее только один раз. Я попытался с imagesScrollView.contentOffset.y == scrollViewBottomOffset, но он не работает и функция не называется

Ответ 1

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

Ответ 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

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

Ответ 4

Карлос, ответ лучше.

Для Swift 4.x вы должны изменить имя метода:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if (scrollView.contentOffset.y + 1) >= (scrollView.contentSize.height - scrollView.frame.size.height) {
            //bottom reached
        }
    }

Ответ 5

реализовать scrollViewDidScroll: и проверить contentOffset тем, что для достижения конца

Ответ 6

Иногда вам придется использовать +1 в условии, потому что contentSize.height дает вам несколько десятичных знаков, поэтому, если вы используете это, вы избегаете этого...

override func scrollViewDidScroll(scrollView: UIScrollView) {

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

Ответ 7

Для Swift 4.5:

func scrollViewDidScroll(_ scrollView: UIScrollView) 
{    
   let scrollViewHeight = scrollView.frame.size.height
    let scrollContentSizeHeight = scrollView.contentSize.height
     let scrollOffset = scrollView.contentOffset.y

    if (scrollOffset == 0)
    {
        // then we are at the top
        print("then we are at the top")
    }
    else if (scrollOffset + scrollViewHeight == scrollContentSizeHeight)
    {
        print("then we are at the end")
        // then we are at the end
    }      
}