81

ユーザーがページング対応の UIScrollView でページを変更したときに、通知を検出または取得する方法はありますか?

4

10 に答える 10

194

これを使用して、現在表示されているページを検出し、ページの変更時に何らかのアクションを実行します。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    static NSInteger previousPage = 0;
    CGFloat pageWidth = scrollView.frame.size.width;
    float fractionalPage = scrollView.contentOffset.x / pageWidth;
    NSInteger page = lround(fractionalPage);
    if (previousPage != page) {
        // Page has changed, do your thing!
        // ...
        // Finally, update previous page
        previousPage = page;
    }
}

スクロールが完全に停止した後にのみページの変更に対応することが許容される場合は、scrollViewDidEndDecelerating:メソッドではなくデリゲート メソッド内で上記を実行することをお勧めしますscrollViewDidScroll:

于 2011-03-11T11:32:49.450 に答える
65

ページングが有効なスクロール ビューでは、scrollViewDidEndDeceleratingを使用して、ビューがページ (同じページである可能性があります) に落ち着いたことを知ることができます。

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

scrollViewDidScrollすべての動きで呼び出されます。また、ページングが有効なビューのコンテキストでは、次のページに移動するのに十分なほどスクロールされたときを見つけるために使用できます (その時点でドラッグが停止した場合)。

于 2012-04-07T16:01:55.597 に答える
17

UIScrollView のデリゲートを実装します。この方法はあなたが探しているものです。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
于 2011-03-11T11:20:25.257 に答える
1

2019年の切り貼り

これを行うのはそれほど簡単ではありません:

var quantumPage: Int = -100 {   // the UNIQUELY LANDED ON, NEVER REPEATING page
    didSet {
        print(">>>>>> QUANTUM PAGE IS \(quantumPage)")
        pageHasActuallyChanged() // your function
    }
}

private var possibleQuantumPage: Int = -100 {
    didSet {
        if oldValue != possibleQuantumPage {
            quantumPage = possibleQuantumPage
        }
    }
}

public func scrollViewDidEndDragging(
                    _ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    if decelerate == false {
        possibleQuantumPage = currentPageEvenIfInBetween
    }
}

public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    possibleQuantumPage = currentPageEvenIfInBetween
}

var currentPageEvenIfInBetween: Int {
   return Int((self.contentOffset.x + (0.5 * self.frame.width)) / self.frame.width)
}

完璧に動作します。

pageHasActuallyChanged人間が「ページの変更」と見なすページをユーザーが変更した場合にのみ呼び出されます。

注意してください: 起動はトリッキーです:

これは起動時に初期化するのが難しく、ページ システムの使用方法によって異なります

どのページ システムでも、"scrollToViewAtIndex..." のようなものがある可能性が非常に高いでしょう。

open func scrollToViewAtIndexForBringup(_ index: Int) {
    if index > -1 && index < childViews.count {
        
        let w = self.frame.size.width
        let h = self.frame.size.height
        
        let frame = CGRect(x: CGFloat(index)*w, y: 0, width: w, height: h)
        scrollRectToVisible(frame, animated: false) // NOTE THE FALSE
        
        // AND IMPORTANTLY:
        possibleQuantumPage = currentPageEvenIfInBetween
    }
}

したがって、ユーザーが 17 ページの「本」を開いた場合、上司のクラスでその関数を呼び出して、起動時に「17」に設定します。

このような例では、そのようなブリングアップ関数で最初に possibleQuantumPage 値を設定があることを覚えておく必要があります。開始状況を処理するための実際に一般化された方法はありません。

結局のところ、たとえば、ブリングアップページに「すばやくスクロール」したい場合がありますが、その「意味」は、quantumPage の状況では誰にもわかりません。そのため、状況に応じて、ブリングアップ中に量子ページ システムを慎重に初期化してください。

いずれにせよ、上部にある 5 つの関数をコピーして貼り付けるだけで、完璧な量子ページングが得られます。

于 2019-11-26T18:13:23.457 に答える
0

スイフト用

static var previousPage: Int = 0
func scrollViewDidScroll(_ scrollView: UIScrollView){
    let pageWidth: CGFloat = scrollView.frame.width
    let fractionalPage: CGFloat = scrollView.contentOffset.x / pageWidth
    let page = lround(Double(fractionalPage))
    if page != previousPage{
        print(page)
        // page changed
    }
}
于 2018-10-26T12:44:46.493 に答える