42

我知道 Apple 文档有以下委托方法:

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

但是,这并不一定意味着您处于底部。因为如果你用手指滚动一下,它就会减速,但你实际上并没有在滚动视图的底部,那么它仍然会被调用。我基本上想要一个箭头来显示我的滚动视图中有更多数据,然后当你在底部时消失(比如它反弹时)。谢谢。

4

7 回答 7

105

我认为您可以做的是检查您的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
    }
}

当用户向上滚动时,您可能还需要一个否定案例来显示您的指示器。您可能还想为其添加一些填充,例如,您可以在用户靠近底部时隐藏指示器,但不完全在底部。

于 2011-06-02T17:38:59.537 回答
22

因此,如果您想快速获得它,请执行以下操作:

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
    }
}
于 2014-10-01T13:23:20.533 回答
14

我认为@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...

    }
}
于 2013-06-28T10:17:55.227 回答
9

仅当底部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
}
于 2014-08-03T19:28:25.343 回答
3

实际上,不仅仅是将@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
    }
}
于 2016-12-03T00:08:05.150 回答
2

它适用于Swift 3

override func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.y == (scrollView.contentSize.height - scrollView.frame.size.height) {
        loadMore()
    }
}
于 2017-01-12T06:43:04.033 回答
0

查看当前在 UIView 中显示的项目,使用类似的方法indexPathsForVisibleRows,如果您的模型的项目多于显示的项目,请在底部放置一个箭头。

于 2011-06-02T17:27:33.673 回答