ただ、私が現在手掛けているアプリでは少々特殊なUIを採用しているため、
このViewControllerをベースにしています。
使っていて気付いた点
良い点
・複数のViewControllerに気持ちいいスクロール&ページングを実装するにはお手軽。
悪い点
・汎用性が低い
基本的な実装方法は
全体の親となるViewController(Navigationとかにしとくと楽)に
UIPageViewControllerをのっける。
あとはPageViewControllerのライフサイクル内で最初のページとなるViewContorollerをセットし、
UIPageViewControllerDelegateメソッドの
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController
viewControllerBeforeViewController:(UIViewController *)viewController;
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController
viewControllerAfterViewController:(UIViewController *)viewController;
にて、前ページ、次ページのViweControllerを返すようにするだけです。
ここで、UIPageViewControllerを使用する際に、ほぼ確実に必要となるページ数の概念なんですが、
これがやっかい!
ページ数の管理を上記二つのメソッドだけで管理しようとしてハマりました。
どうやら上記二つのメソッドは、
初回にめくろうとしたタイミングでafter(before)のほうが二回呼ばれます。
これはページをめくった段階でさらに次のページまで生成してくれるからです。
これが落とし穴でした。
例えば、この二つのメソッドでページの管理をすると最初を0ページ目として、
afterに++、beforeに--を設定しておきます。
すると、1ページめくった際にLogをみてみると
0
1
2
となってしまうわけです。
解決方法
UIPageViewControllerを使用すると、どうしても内包するViewControllerで自分のページ数が必要になります。
これとさきほどの問題点を併せて、
上記二つのメソッドでViewControllerを作成しreturnする際に、各ViewControllerにページをセットしてやります。これで自分のページ数は解決。
さらに、このままではUIPageViewControllerのほうのページ数がずれたままなので、
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed;
これを使います。
これは読んで字のごとく、スクロール(ページング)のアニメーションが終了したタイミングで呼ばれます。ページングなので途中で話してページが戻った場合にも対応できます。
if (completed) {
UIViewController *vc = [pageViewController.viewControllers objectAtIndex:0];
pageIndex = vc.pageIndex;
いろいろ
}
としておけば、めくりが終了した段階でUIPageViewControllerに現在表示されているページ数が設定されるわけです。 [pageViewController.viewControllers objectAtIndex:0]の書き方がものすごい気持ち悪いのは置いておきましょう。
これで基本的なUIPageViewControllerの使い方は網羅できたのではないでしょうか。
汎用性が悪いと書いたのは、まだまだこのUIPageViewControllerを使ってハマった点があるからです。
そのほかのハマった点と解決(逃げ)策はまた後程。
最近、人生初めて世に言う「ブランドもの」なるものを買ったのですが(9万円ほどのジミーチュウの財布)、買い物欲みたいなのが少しわかった気がします。
高い買い物をした際のえも言われぬ高揚感は、人間の生理的欲求のどれにも属さないかつ物欲とも若干異にするなにかしらの快楽が確かにあると感じました。
「欲」についての勉強をしたくなりました。
0 件のコメント:
コメントを投稿