iPhone – 知道如果UIScrollView达到顶部或底部

有没有办法知道一个UIScrollView是否已经达到顶部或底部内部

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

谢谢。

在你的类中实现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的值有修补程序。

那么,当你试图确定scrollView是在顶部还是在底部时, contentInsets也会涉及到。 当你的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 } } 

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

如果你想在快速的代码:

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

我想清楚如何做到这一点:

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

简单而干净的扩展:

 import UIKit extension UIScrollView { var scrolledToTop: Bool { let topEdge = 0 - contentInset.top return contentOffset.y <= topEdge } var scrolledToBottom: Bool { let bottomEdge = contentSize.height + contentInset.bottom - bounds.height return contentOffset.y >= bottomEdge } } 

在GitHub上:

https://github.com/salutis/swift-scroll-view-edges