UIScrollView,到达滚动视图的底部

时间:2011-06-02 17:23:09

标签: iphone uiscrollviewdelegate

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

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

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

7 个答案:

答案 0 :(得分:97)

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

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

答案 1 :(得分:16)

所以,如果你想要它迅速,那么你去吧:

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

答案 2 :(得分: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...

    }
}

答案 3 :(得分: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
}

答案 4 :(得分:3)

实际上,这个代码(用Swift 3编写)不仅仅是将@bensnider的代码放在scrollViewDidScroll中,而是性能更好:

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

答案 5 :(得分:2)

它适用于Swift 3

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

答案 6 :(得分:0)

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