2011-06-02 48 views
32

的底部,我知道蘋果的文檔具有以下的委託方法:的UIScrollView,達到滾動視圖

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

然而,這並不一定意味着你是在底部。因爲如果你用手指,滾動一下,然後減速,但你實際上不在滾動視圖的底部,那麼它仍然被調用。我基本上想要一個箭頭來顯示我的滾動視圖中有更多的數據,然後當你處於底部時(例如它彈起時),它會消失。謝謝。

回答

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

你可能還需要一個消極的情況,當用戶滾動備份時顯示你的指標。您可能還需要添加一些填充項,例如,當用戶靠近底部但不完全位於底部時,可以隱藏指示器。

+10

最好的解決辦法,但我把它放在 - (空)scrollViewDidScroll:(UIScrollView的*)滾動視圖{}代替 – MobileMon 2013-01-07 17:27:10

+0

@MobileMon是正確的,應該在'scrollViewDidScroll'使用方法。 – 2016-05-06 09:10:47

+0

只是我正在尋找的路線。也適用於UICollectionView。 – 2016-10-03 20:09:11

0

查看UIView中當前顯示的項目,使用類似indexPathsForVisibleRows的項目,並且如果您的模型的項目多於顯示的項目,請將箭頭放在底部。

+0

問題是,它只是文本數據... – Crystal 2011-06-02 17:30:52

13

我想@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... 

    } 
} 
+1

是的,這應該是被接受的答案。另外,我認爲contentScale因子應該用在方程式 – Luke 2016-02-08 11:49:46

8

接受的答案只能如果底部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 
} 
+2

這是比接受的答案更好的答案。 – 2015-02-07 11:47:51

14

所以,如果你想讓它在迅速,在這裏你去:

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的代碼在scrollViewDidScroll,這個代碼(寫在斯威夫特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 
    } 
} 
2

它在Swift 3工作:

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