なんか作る&なんかする

蓄財とあらゆる保守管理の備忘録

UIPageViewControllerのサンプルとUIPageControlについて

「写真を指でぺっぺっと見られるような画面」を作りたくてやり方を探すと、UIPageViewController というものを使ってやるらしいと分かった。

 やり方とかサンプルを探したが、すぐにでてくるだろ〜と思ったら、意外とない。どういうことだ。やっと見つけた。

AppCoda How To Create UIPageViewController in Storyboard | iOS Programming

 2013年11月の記事なので、ちょうどよい。サンプルソースもダウンロードできる。太っ腹。英語だけど文章はほとんど読まずに動くものが作れる。その善し悪しはさておき。

 見ながら作ったらそれっぽいものが出来て動いて、PageControl いま何ページ目を示すドット が勝手に表示される。へぇ便利だなと思ったが、位置とかは表示できないらしい。(色を変えるときは、AppDelegateで、UIPageControlのappearanceを変更しておく。場所によって色を変えたいときは他にやり方あるらしい)

 ここまでは良かったが。たとえば、ハイクのエントリに3枚の画像が添付されてあって、2枚目をタップしたら、2ページ目を表示するようにしたい。それはできたんだけど、UIPageControlの同期がとれない。2ページ目でも、currentPageが0になっている…。

  • 現在の表示中のページを取得して
  • UIPageControlのcurrentPageにセット

 すればいいんじゃないかと考え、まず、「現在表示中のページ(インデックス)」を取得しようとしたら、あらやだ意外とめんどくさい。

 UIPageViewControllerを操作するViewControllerは、UIPageViewControllerDataSourceをデリゲートしているが、もひとつUIPageViewControllerDelegateを追加する。現在地のプロパティを追加する。そして、didFinishAnimating を実装する。

-(void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
    if(completed){
        ImageViewController *vc =[self.pageViewController.viewControllers lastObject];
        self.currentPageIndex =  vc.pageIndex;
    }
}

 よしこれで多分一応あっていることにして、UIPageControlに値を設定したい。いったい、UIPageControlを操作するにはどうすればよいのか?。調べたがなんとも見当違いなことをしようとしているのかこれといったこたえが見つからず、洗濯物干しながらまじめに考えた。

 そもそも、UIPageControlはどうして勝手に表示されているのか。UIPageViewControllerDataSource のメソッドのうち、presentationCountForPageViewControllerとpresentationIndexForPageViewControllerを実装していると、表示される。そうだったのか…。

 presentationCount... のほうは全体のページ数、presentationIndex...は現在の? ならば、ここで現在地を返せばいいんじゃね?、とやってみる。

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
{
    return self.currentPageIndex;
}

 これで結局なんとかうまくいったのだけど、最初はうまくいかなくて、2回目はなんとかなった。最初はおかしくて、どうしてやり直したらうまくいったのかよくわからない。こういうことはよくあるけど。まぁいっか。