LoginSignup
18
21

More than 5 years have passed since last update.

UIPageViewControllerの1番簡潔なサンプル

Last updated at Posted at 2016-02-08

UIPageViewControllerを使おうと思った時に、Page-Based-Applicationみたいなテンプレはよくわからないし、いろいろ見ても結局最低限何が欲しいんだ!っていうのがわかりにくかったのでメモ・・・
そして理解しきってないのでご指摘欲してます

UIPageViewControllerってなんだ?

ずばり、UIViewControllerをいくつも同等な関係性で配置でき(tabbarみたいな感じ)、それをスワイプで遷移させられるもの
個人的に、TabBarControllerの、TabBarがない&スワイプで遷移できる、ものと認識してます
あと、キュレーション系のアプリではコンテンツ部分でよく使われているらしい・・・

最低限要るであろうもの

  • HogeViewController
  • PiyoViewController

それぞれコードは以下のような感じです。おそらく最低限です


import UIKit

class PiyoViewController: UIViewController, UIPageViewControllerDataSource {

    let colors = [UIColor.redColor(), UIColor.yellowColor(), UIColor.blueColor()]

    override func viewDidLoad() {
        super.viewDidLoad()

        let pageViewController = UIPageViewController(transitionStyle: UIPageViewControllerTransitionStyle.Scroll, navigationOrientation: UIPageViewControllerNavigationOrientation.Horizontal, options: nil)
        pageViewController.dataSource = self

        let startingViewController = viewControllerAtIndex(0)!
        let viewControllers = [startingViewController]
        pageViewController.setViewControllers(viewControllers, direction: .Forward, animated: false, completion: nil)
        pageViewController.view.frame = self.view.frame

        self.addChildViewController(pageViewController)
        self.view.addSubview(pageViewController.view!)
        pageViewController.didMoveToParentViewController(self)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func viewControllerAtIndex(index: Int) -> HogeViewController? {
        if index >= colors.count {
            return nil
        }

        let hogeViewController = HogeViewController()
        hogeViewController.pageIndex = index
        hogeViewController.backgroundColor = colors[index]

        print(index)
        return hogeViewController
    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
        var index = (viewController as! HogeViewController).pageIndex

        if index == 0 {
            print("before nil:: \(index)")
            return nil
        }

        index--

        print("before's return \(index)")

        return viewControllerAtIndex(index)
    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
        var index = (viewController as! HogeViewController).pageIndex

        index++

        if index == self.colors.count {
            print("after nil")
            return nil
        }
        print("after's return  \(index)")
        return viewControllerAtIndex(index)
    }



}




import UIKit

class HogeViewController: UIViewController {

    var pageIndex: Int = 0
    var backgroundColor: UIColor?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = backgroundColor!
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}


現時点でわかったことと謎

  • 実際に乗せる、datasourceで必須なメソッドに返り値として渡してあげるViewControllerはその都度生成されたインスタンスでなければならない(?)

  • 今回は同じViewControllerのClass(HogeViewController)からインスタンスを必要な分生成して表示しているが、別々のViewControllerのクラスを使用する場合、before, afterのpageViewControllerメソッドで以下のように処理をすることでできた(2つのViewControllerクラスを表示させている)

//beforeの方
//isFirstはBool型の変数。初期値はtrue
if isFirst {
            return nil
        } else {
            isFirst = true
            let showReviewViewController = ShowReviewViewController()
            return showReviewViewController
        }

その他 

  • UIPageViewControllerのインスタンス生成時に設定してるやつがなんなのかとか→ http://qiita.com/kumagi/items/289ccadf344f32613304

  • その構成に関して 参照→http://qiita.com/yd_niku/items/b9f10bf5071971a1d8da

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



探してみるとけっこう情報が少なく手探り手探りな感じです・・・なにかいい記事などあれば紹介いただきたいです

追記

現時点でわかっていることと謎

の部分で述べた2つのviewControllerClassを表示させる場合について、スワイプするうちにViewControllerの表示数が増える謎挙動が起こったため、以下のようにクラス名を取得し、それによって条件わけをする方法をとることで解決した。


let className = NSStringFromClass(viewController.dynamicType).componentsSeparatedByString(".").last!


if className == "ShowReviewViewController" {
            let showReviewController = ShowChartViewController()
            return showReviewController
        } else if className == "ShowChartViewController" {
            return nil
        } else {
            return nil
        }

  • 新たな謎

beforeやafterのpageViewControllerメソッドの呼ばれるタイミングがことごとく謎。
右にスワイプ(つまりafterが呼ばれるはず)したときにはなぜかafterの後にbeforeが呼ばれるなど謎極まりない・・・

18
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
21