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 >= scrollView.contentSize.height)
,这个方法会持续调用
2 。在此,如果我们选择==
,则此条件也将有效两次。
我觉得这样更准确。
在极少数情况下,此规则也有效两次。但用户不会遇到这种情况。
- (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 浮动?