UIPageViewControllerを調べてみた

基本的な使い方

UIPageViewControllerと、UIPageViewControllerDataSourceプロトコルを使うと、実際の中身のページを良い感じで切り替えてくれる。

  • 必要に応じてUIPageViewControllerDelegateプロトコルを実装する。
  • 実際のページ用のUIViewControllerのサブクラスを実装する。
  • UIPageViewControllerDataSourceプロトコルを実装する。(親クラスはNSObjectとかでよい)
    • データを保持してページ指定にしたがって取り出せるような感じの実装しておく。
    • ページ遷移が発生したら実際のページインスタンスを生成しデータを紐付けるような処理をさせる。
      • pageViewController:pageViewController viewControllerBeforeViewController:viewController
      • pageViewController:pageViewController viewControllerAfterViewController:viewController
  • UIPageViewController::dataSourceにUIPageViewControllerDataSourceインスタンスを設定する
  • 初期化時

参考)http://d.hatena.ne.jp/hyoromo/20130406/1365274911

構成

親のUIViewControllerがUIPageViewControllerとUIPageViewControllerDataSource,、UIPageControlを持っていて遷移の概要を管理し、データそのものと中身のページは基本的にUIPageViewControllerDataSourceが与えるような感じみたいです。

UIPageViewControllerの実装

初期化時にいくつか設定する。

  • transitionStyle
    • ページ送りの表現の種類。カールするかスライドか選べる。
    • UIPageViewControllerTransitionStyle
  • navigationOperation
    • ページ送りする方向の設定。縦か横か選べる。
    • UIPageViewControllerNavigationOrientation

本のレイアウト情報であるspineLocationとか余白の設定をしたい場合はNSDictionaryに入れてoptionsで渡すと設定できる。 これらは基本的にすべてread-only。

参考) http://d.hatena.ne.jp/hyoromo/20130422/1366658331

もしStoryBoardで上記のプロパティを設定する場合、クラスをUIPageViewControllerにセットしておけばAttributes Inspectorのところにそれ用のチェックボックスが出てくるので適宜設定しておく。

構成としてはUIPageViewControllerを継承してStoryboardで管理しようと思ったけど、 UIPageControlを直接は保持できないみたいだし、他のUIViewControllerに紐付けるわけでもなかったので、コードでインスタンス化する形にしました。

UIPageViewControllerDataSourceプロトコルの実装

プロトコルさえ実装されていればNSObjectでもなんでもいい。 ページが遷移した時に次のUIViewControllerを返すメソッドを実装する感じです。

前後にページ遷移が発生したことが分かるだけでindex的なものは持っていないため、NSArrayとかで管理したいのであれば適宜実装する。 発生した方向に次のUIViewControllerがなければnilを返す。

UIPageViewControllerDelegateの実装

画面遷移の前後のタイミングやデバイスの向きが変わったときに呼ばれるみたいです。

公式ドキュメント