UIScrollView で現在の表示位置が何ページにあたるかを取得する : Objective-C プログラミング

PROGRAM


UIScrollView で現在の表示位置が何ページにあたるかを取得する

UIScrollView では、pagingEnabled を YES に設定することで、ページ単位でスクロールさせることができます。

表示されている位置は contentOffset プロパティで取得することができますが、これをページ番号に変換する方法を考えてみます。

 

UIScrollView でいう "ページ" の単位は bounds のサイズによるようなので、たとえば横スクロールの場合には、次のようにしてページ番号を計算することができる感じです。

NSUInteger page = (NSUInteger)(scrollView.contentOffset.x / scrollView.bounds.size.width) + 1;

このようにすることで、現在の表示位置からページ番号が求められました。

最後に +1 しているのは、最初のページを 1 と数えるためです。

 

ページがスクロールされたかどうかを検出する

UIScrollView がスクロールされたときには、いくつかの UIScrollViewDelegate メソッドが呼ばれます。

通常のスクロールであれば、移動位置がリアルタイムで変わって行くため、それらのメソッドを追いながら位置を特定する必要がありますが、ページ単位の場合にはページ単位での移動状況が知れると便利です。

ページ単位でのスクロールの場合、最終的には、隣のページに移動したか、「隣のページがないか移動する量が足りないかで元のページに戻ったか、といったことが検出のタイミングになると思います。

 

それらは、スクロールの動きが完全に止まった段階で、その時点の表示位置からページ番号を割り出して、それが以前と変化したかで、知ることができそうです。

そこで、完全にスクロールが止まった時点では scrollViewDidendDecelerating: メソッドが呼ばれるので、現在のページ位置を _currentPage 変数で記憶しているとすると、次のようにして、ページが移動されたかを判定してみます。

- (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView

{

// メソッドに渡された scrollView を使って、先ほどと同じ方法で、現在位置からページ番号を割り出します。

NSUInteger page = (NSUInteger)(scrollView.contentOffset.x / scrollView.bounds.size.width) + 1;

 

// あらかじめ保存しておいたページ番号と照らし合わせます。

if (_currentPage != page)

{

// 現在のページ番号を更新します。

_currentpage = page;

 

// ここでページが変わったときの処理を行います。

 

}

}

このようにすることで、UIScrollView がページ単位でスクロールしたときに何かをするようなプログラムを記載することができそうです。

[ もどる ]