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

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




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

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/** 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日火曜日