PageViewControllerをうまくループさせる方法(Swift2)

PageViewControllerクラスにindexとか持たせないようにね




基本は以下
http://qiita.com/paming/items/a6e3cf15e1178d01d57d

キャストしてもいいんだけど手頃なタグを使ってみた
普通にキャストしたほうが良かったかもしれない


/** Labelを一つだけ持つシンプルなViewController */
class CustomViewController: UIViewController {
    
    @IBOutlet var numberLabel: UILabel!
    
    var number: String = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        numberLabel.text = number
    }
}

class PageViewController: UIPageViewController, UIPageViewControllerDataSource {
    
    private var viewControllerList = [UIViewController]()
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        // viewcontroller作成
        for i in 0..<3 {
            
            // それぞれの画面の設定 以下は同様の画面構成を想定しているがそれぞれ違うVCでも可
            let vc = CustomViewController()
            // この段階ではラベルはnilなので適当なメンバに入れてViewDidLoadでラベルの値を設定する
            vc.number = i.description
            
            // タグに連番を振る 識別さえできればOK
            vc.view.tag = viewControllerList.count
            
            viewControllerList.append(vc)
        }
      
        // ページ移動させるViewControllerの設定 そのまま配列を渡せばいいというわけでもない模様
        self.setViewControllers([viewControllerList.first!], direction: .Forward, animated: false, completion: nil)
        
        /** 画面のズレを防ぐ */
        self.automaticallyAdjustsScrollViewInsets = false
        
        self.dataSource = self
        
    }
    
    /** 現在表示中のVCの前のVCを設定する */
    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
        
        var index = viewController.view.tag - 1
        if( index < 0 ) {
            index = viewControllerList.count-1
        } 
        return viewControllerList[index]
        
    }
    
    /** 現在表示中のVCの次のVCを設定する */
    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
        
        var index = viewController.view.tag + 1
        if( index == viewControllerList.count ) {
            index = 0
        }
        return viewControllerList[index]
    }   
}
func pageViewController(... が呼び出されるタイミングはあまり直感的ではないので注意

ちょっとわかりにくいけど以下のようになる
pageviewController


2016年8月23日火曜日