42

Appleのドキュメントには次のデリゲートメソッドがあることを知っています。

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

しかし、それは必ずしもあなたが一番下にいることを意味するわけではありません。指を使って少しスクロールすると減速しますが、実際にはスクロールビューの一番下にいない場合でも、呼び出されます。基本的に、スクロールビューにさらに多くのデータがあることを示す矢印が必要であり、下部にいるとき(バウンスするときなど)に消えます。ありがとう。

4

7 に答える 7

105

あなたができることは、あなたの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
    }
}

ユーザーが上にスクロールしたときにインジケーターを表示するには、負のケースも必要になる可能性があります。また、パディングを追加することもできます。たとえば、ユーザーが一番下にいるが、正確には一番下にいない場合にインジケーターを非表示にすることができます。

于 2011-06-02T17:38:59.537 に答える
22

したがって、迅速に実行したい場合は、次のようにします。

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
    }
}
于 2014-10-01T13:23:20.533 に答える
14

@bensniderの答えは正しいと思いますが、exartではありません。この2つの理由から

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

チェックすると、このメソッドは継続的に呼び出されますif (bottomEdge >= scrollView.contentSize.height)

2. これで、チェックに行くと、==この条件は 2 回有効になります。

  • (i)スクロールビューの最後が下端に触れたときに上にスクロールするとき
  • (ii) スクロールビューが元の位置を保持するために跳ね返ったとき

こちらの方が正確な気がします。

このコードが 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...

    }
}
于 2013-06-28T10:17:55.227 に答える
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
}
于 2014-08-03T19:28:25.343 に答える
3

実際には、@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
    }
}
于 2016-12-03T00:08:05.150 に答える
2

それはで働きSwift 3ます:

override func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.y == (scrollView.contentSize.height - scrollView.frame.size.height) {
        loadMore()
    }
}
于 2017-01-12T06:43:04.033 に答える
0

次のようなものを使用して、UIView に現在表示されているアイテムをindexPathsForVisibleRows確認し、モデルに表示されているよりも多くのアイテムがある場合は、一番下に矢印を配置します。

于 2011-06-02T17:27:33.673 に答える