teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

回答追記

2017/08/27 17:13

投稿

TakeOne
TakeOne

スコア6299

answer CHANGED
@@ -49,3 +49,38 @@
49
49
  現在表示されているビューコントローラーのページ番号を知ることもできます。
50
50
  このページ番号に相当しているのが、今回の質問ではindexなのだと思います。
51
51
 
52
+ ---
53
+ (8/28 2:10追記)
54
+
55
+ 確かに、EachViewControllerにindexを入れておけば、それで十分だと思います。
56
+
57
+ またStripeさんがおっしゃっている通り、それを使えばPageViewControllerの
58
+ indexプロパティは不要になるので、削除してしまえばよいと思います。
59
+
60
+ さらに、EachViewControllerを使い回す場合は2個で十分という話もありますが、
61
+ ページ切り替えに速度を求めないなら、使い回しでさえ不要で、ページ切り替え毎に
62
+ EachViewControllerを新しく作ればいいという話もあります。
63
+
64
+ (サンプル)
65
+ ```
66
+ extension PageViewController : UIPageViewControllerDataSource {
67
+
68
+ func pageViewController(_ pageViewController:
69
+ UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
70
+ return nextPage(pageViewController, moveTo:1)
71
+ }
72
+
73
+ func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController:UIViewController) -> UIViewController? {
74
+ return nextPage(pageViewController, moveTo:-1)
75
+ }
76
+
77
+ func nextPage(_ pageViewController: UIPageViewController, moveTo:Int) -> EachViewController {
78
+ let currentPage = pageViewController.viewControllers?.first as! EachViewController
79
+ let newIndex = (currentPage.index + moveTo) % count
80
+ let newPage = EachViewController()
81
+ newPage.setBackgroundRgba(rgba[newIndex])
82
+ newPage.setIndexTo(newIndex)
83
+ return newPage
84
+ }
85
+ }
86
+ ```

1

補足を受けて回答追加

2017/08/27 17:13

投稿

TakeOne
TakeOne

スコア6299

answer CHANGED
@@ -18,4 +18,34 @@
18
18
  }
19
19
  ```
20
20
  という形で配列番号に対応するする背景色を設定済みなので、
21
- ページ切り替え時に背景色を設定し直す必要すらないように思います。
21
+ ページ切り替え時に背景色を設定し直す必要すらないように思います。
22
+
23
+ ---
24
+ (8/24 21:40追記)
25
+
26
+ 補足ありがとうございます。
27
+ やりたいことがわかりました。
28
+
29
+ そういうことであれば、
30
+ [https://developer.apple.com/documentation/uikit/uipageviewcontrollerdelegate/1614090-pageviewcontroller](https://developer.apple.com/documentation/uikit/uipageviewcontrollerdelegate/1614090-pageviewcontroller)
31
+ で説明されている、
32
+ `UIPageViewControllerDelegate`の`pageViewController(_:didFinishAnimating:previousViewControllers:transitionCompleted:)`メソッドを使うとうまくいくと思います。
33
+
34
+ 現在実装している`UIPageViewControllerDataSource`のメソッドは、
35
+ 次に表示するビューコントローラーを教えてくれと言っているだけであり、
36
+ それが呼ばれたからと言って必ずページ遷移するわけではありません。
37
+
38
+ 上記で紹介したメソッドを使えば、画面遷移のアニメーションが完了したタイミングで呼ばれ、
39
+ 次の画面に遷移した時は、transitionCompletedパラメータがtrue、
40
+ 次に遷移するのをやめて戻した時は、transitionCompletedパラメータがfalse
41
+ で呼ばれます。
42
+ これを使うとうまくいくと思います。
43
+
44
+ また、
45
+ [http://qiita.com/eKushida/items/d4fe95576a86f9e1d9fb](http://qiita.com/eKushida/items/d4fe95576a86f9e1d9fb)
46
+ の「ページ番号の取得」の例にあるように、このタイミングでviewControllers.firstを取得すれば、
47
+ アニメーションが完了して現在表示されているビューコントローラーを得ることができますので、
48
+ そのビューコントローラーのプロパティにページ番号を入れておけば、
49
+ 現在表示されているビューコントローラーのページ番号を知ることもできます。
50
+ このページ番号に相当しているのが、今回の質問ではindexなのだと思います。
51
+