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が呼ばれるなど謎極まりない・・・