iPhone-UIScrollView가 상단 또는 하단에 도달했는지 확인


86

A가 UIScrollView내부의 상단 또는 하단에 도달 했는지 알 수있는 방법이 있습니까?

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView 
                  willDecelerate:(BOOL)decelerate

?

감사.

답변:


199

UIScrollViewDelegate클래스에서 구현 한 다음 다음을 추가하십시오.

-(void)scrollViewDidScroll: (UIScrollView*)scrollView
{
    float scrollViewHeight = scrollView.frame.size.height;
    float scrollContentSizeHeight = scrollView.contentSize.height;
    float scrollOffset = scrollView.contentOffset.y;

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

이것이 당신이 추구하는 것이기를 바랍니다! 그렇지 않으면 위의 코드에 더 많은 조건을 추가하고 NSLog에 scrollOffset 값을 추가하여 문제를 해결하십시오.


4
당신이에 있다면 navigationController, 당신은 더 많은이 같은 작업을 수행 할 수 있습니다 : scrollOffset <= (0 - self.navigationController.navigationBar.frame.size.height - 20)(scrollOffset + scrollHeight) >= scrollContentSizeHeight
웨인

그것의 문제는 바운스입니다 ... 모든 것이 상단 또는 하단에 도달하면 두 번 호출됩니다. 테이블 또는 컬렉션 뷰 바운스를 끄는 것 외에 해결책이 있습니까?
denikov 2014-08-29

@denikov 그것에 대한 해결책을 찾았습니까?
Priyal

83

글쎄, contentInsets당신이있는 ScrollView가 상단 또는 하단에 있는지 여부를 확인하려고 할 때도 참여하고 있습니다. 당신의있는 ScrollView이 때 당신은 또한 경우에 관심이있을 수 위의 위쪽과 아래 바닥. 다음은 상단 및 하단 위치를 찾는 데 사용하는 코드입니다.

빠른:

extension UIScrollView {

    var isAtTop: Bool {
        return contentOffset.y <= verticalOffsetForTop
    }

    var isAtBottom: Bool {
        return contentOffset.y >= verticalOffsetForBottom
    }

    var verticalOffsetForTop: CGFloat {
        let topInset = contentInset.top
        return -topInset
    }

    var verticalOffsetForBottom: CGFloat {
        let scrollViewHeight = bounds.height
        let scrollContentSizeHeight = contentSize.height
        let bottomInset = contentInset.bottom
        let scrollViewBottomOffset = scrollContentSizeHeight + bottomInset - scrollViewHeight
        return scrollViewBottomOffset
    }

}

목표 -C :

@implementation UIScrollView (Additions)

- (BOOL)isAtTop {
    return (self.contentOffset.y <= [self verticalOffsetForTop]);
}

- (BOOL)isAtBottom {
    return (self.contentOffset.y >= [self verticalOffsetForBottom]);
}

- (CGFloat)verticalOffsetForTop {
    CGFloat topInset = self.contentInset.top;
    return -topInset;
}

- (CGFloat)verticalOffsetForBottom {
    CGFloat scrollViewHeight = self.bounds.size.height;
    CGFloat scrollContentSizeHeight = self.contentSize.height;
    CGFloat bottomInset = self.contentInset.bottom;
    CGFloat scrollViewBottomOffset = scrollContentSizeHeight + bottomInset - scrollViewHeight;
    return scrollViewBottomOffset;
}


@end

이 좋은 대답은, scrollviewdidscroll을 구현하는 performences에 대한 나쁜
Vassily

3
scrollViewDidScroll을 사용하지 않는 경우 어떻게 호출합니까?
Dave G

2
스위프트 3. 그래서에서 하단에 변경하는 경우 때문에 부동 소수점 연산의 변덕, 나는 1879.05xxx의 "verticalOffsetForBottom"를 얻고 있었다 나의 contentOffset.y 1879이었다 return scrollViewBottomOffsetreturn scrollViewBottomOffset.rounded()
chadbag

1
iOS 11 safeAreaInsets부터는이를 고려합니다. scrollView.contentOffset.y + scrollView.bounds.height - scrollView.safeAreaInsets.bottom
InkGolem

36

신속한 코드를 원한다면 :

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


4

나는 그것을하는 방법을 정확히 알아 냈습니다.

CGFloat maxPosition = scrollView.contentInset.top + scrollView.contentSize.height + scrollView.contentInset.bottom - scrollView.bounds.size.height;
CGFloat currentPosition = scrollView.contentOffset.y + self.topLayoutGuide.length;

if (currentPosition == maxPosition) {
  // you're at the bottom!
}

0

다음과 같이하십시오 (Swift 3의 경우) :

class MyClass: UIScrollViewDelegate {

   func scrollViewDidScroll(_ scrollView: UIScrollView) {

        if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) {
           //scrolled to top, do smth
        }


    }
}

SO에 오신 것을 환영합니다! 답변에 코드를 게시 할 때 코드가 OP의 문제를 어떻게 해결하는지 설명하는 것이 도움이됩니다. :)
Joel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.