ユーザーがページング対応の UIScrollView でページを変更したときに、通知を検出または取得する方法はありますか?
10 に答える
これを使用して、現在表示されているページを検出し、ページの変更時に何らかのアクションを実行します。
- (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:
。
ページングが有効なスクロール ビューでは、scrollViewDidEndDeceleratingを使用して、ビューがページ (同じページである可能性があります) に落ち着いたことを知ることができます。
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
scrollViewDidScroll
すべての動きで呼び出されます。また、ページングが有効なビューのコンテキストでは、次のページに移動するのに十分なほどスクロールされたときを見つけるために使用できます (その時点でドラッグが停止した場合)。
UIScrollView のデリゲートを実装します。この方法はあなたが探しているものです。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
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 つの関数をコピーして貼り付けるだけで、完璧な量子ページングが得られます。
スイフト用
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
}
}