UIScrollView,到达滚动视图的底部

Posted

技术标签:

【中文标题】UIScrollView,到达滚动视图的底部【英文标题】:UIScrollView, reaching the bottom of the scroll view 【发布时间】:2011-06-02 17:23:09 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

最好的解决方案,但我会把它放在 - (void)scrollViewDidScroll:(UIScrollView *)scrollView 中 @MobileMon 是对的,应该在scrollViewDidScroll 方法中使用。 只是我正在寻找的行。也适用于 UICollectionView。 如果您愿意将您的逻辑放入scrollViewDidScroll,您可以设计一些保护标志来防止您的逻辑触发数百万次。这是因为您在那里有>=,当您的表格视图反弹时,它将成功进入if 子句一百万次。减速结束是更好观察的事件,因为它在反弹完成后被调用 如果我调用 scrollViewDidEndDecelerating 不会触发:cv.scrollToBottom()【参考方案2】:

所以如果你想要它在swift中,你去:

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】:

我认为@bensnider 的答案是正确的,但不是exart。因为这两个原因

1. - (void)scrollViewDidScroll:(UIScrollView *)scrollView

如果我们检查if (bottomEdge &gt;= 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...

    

【讨论】:

是的,这应该是公认的答案。另外,我认为应该在方程式中使用 contentScale 因子【参考方案4】:

仅当底部的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

【讨论】:

【参考方案5】:

实际上,不仅仅是将@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
    

【讨论】:

【参考方案6】:

它在Swift 3 中工作:

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

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于UIScrollView,到达滚动视图的底部的主要内容,如果未能解决你的问题,请参考以下文章

将 UIImageView 对齐到 UIScrollView 的底部

scrollViewDidScroll(_ scrollView: UIScrollView) 到达底部后如何保持 UIButton 浮动?

仅当父滚动视图到达结束时滚动子滚动视图

滚动时如何将 UIScrollView 子视图“粘贴”到顶部/底部?

UIScrollview 底部的额外空白区域

将 UIScrollView 中的内容视图固定到其底部而不是其顶部边缘