UIPageViewController 的使用
class ViewController: UIViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource, UIScrollViewDelegate {
private let page = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: [UIPageViewController.OptionsKey.interPageSpacing: 0])
private var controllers: [Int: UIViewController] = [:]
override func viewDidLoad() {
super.viewDidLoad()
let v0 = createController(0)
page.setViewControllers([v0], direction: UIPageViewController.NavigationDirection.reverse, animated: true) { flag in
print("finish::\(flag)")
}
page.delegate = self
page.dataSource = self
addChild(page)
page.view.frame = view.frame
view.addSubview(page.view)
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
let days = (viewController as! FirstController).days
if days - 1 < 0 {
return nil
}
return createController(days - 1)
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
let controller = (viewController as! FirstController)
let days = controller.days
return createController(days + 1)
}
private func createController(_ index: Int) -> UIViewController {
if let controller = controllers[index] {
print("cache\(index)")
return controller
}
if index % 2 == 0 {
let controller = FirstController(days: index)
controller.callback = { [weak self] index in
guard let `self` = self else { return }
self.page.setViewControllers([self.createController(index)], direction: UIPageViewController.NavigationDirection.forward, animated: true) { flag in
print("finish::\(flag)")
}
}
controllers[index] = controller
return controller
}
let controller = SecondController(days: index)
controller.callback = { [weak self] index in
guard let `self` = self else { return }
self.page.setViewControllers([self.createController(index)], direction: UIPageViewController.NavigationDirection.reverse, animated: true) { flag in
print("finish::\(flag)")
}
}
controllers[index] = controller
return controller
}
}
class FirstController: UIViewController {
var days: Int
var callback: ((Int) -> Void)?
init(days: Int) {
self.days = days
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private let label = UIButton()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .yellow
view.addSubview(label)
label.frame = CGRect(x: 0, y: 200, width: 200, height: 200)
label.setTitle( "\(days)", for: .normal)
label.backgroundColor = .green
label.addTarget(self, action: #selector(nextf), for: .touchUpInside)
}
@objc func nextf() {
callback?(days + 3)
}
}
class SecondController: FirstController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .red
}
@objc override func nextf() {
callback?(days - 3)
}
}