我知道Apple文档有以下委托方法:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; // called when scroll view grinds to a halt
然而,这并不一定意味着你处于最底层。因为如果你使用你的手指,滚动一下,然后它减速,但你实际上并不在滚动视图的底部,然后它仍然被调用。我基本上想要一个箭头来显示我的滚动视图中有更多数据,然后当你在底部时就会消失(就像它反弹时一样)。感谢。
答案 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。如果我们去==
检查,这个条件也会有效两次。
我觉得这更准确。
极少数情况下,这个法令也有效两次。但是用户不会遇到这个。
- (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中当前显示的项目,如果您的模型的项目数量多于显示的项目,请在底部放置一个箭头。