環境: Xcode8.2.1, Swift3
UIScrollViewのisPagingEnabled
プロパティを true にすると、ページ単位のスクロールが可能になる。
このときに現在のページ数を求める方法についてメモ。
ページングは横スクロールの場合なら UIScrollView のcontentOffset.x
がUIScrollView.bounds.width
の半分を超えたところでドラッグを離すと隣のページに進み、半分を超えてなければ元のページに戻る挙動になっている。
まず、その時点のcontentOffset.x
からページ数を計算する Extension を追加する。
extension UIScrollView { var currentPage: Int { return Int((self.contentOffset.x + (0.5 * self.bounds.width)) / self.bounds.width) + 1 } }
で、今回はページングのスクロールが完全に止まったタイミングでページ数を取得する方法を考える。
スクロールが完全に止まったタイミングを検出するには前回調べた UIScrollViewDelegate のメソッドに仕掛ければよい。
基本scrollViewDidEndDecelerating
のみで良いと思う(isPagingEnabled=true
はページの区切りまで自動スクロールするので)が、この Delegate はドラッグをピタッと止めた場合は呼ばれないので、その時でも検出できるように念のためscrollViewDidEndDragging
でかつdecelerate=false
の場合にも取得するようにしておく。
// MARK: - UIScrollViewDelegate func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { if !decelerate { print("currentPage:", scrollView.currentPage) } } func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { print("currentPage:", scrollView.currentPage) }
これでページ数が切り替わった(ページングのスクロールが止まった)時に1度のみページ数が表示される。