UIPageViewController是于iOS5引入的,是一个Controller容器,如果你的应用程序有多个在功能上并列/垂直的controller,之间需要灵活切换。垂直时建议使用 TransitionStyle.scroll(可以实现淘宝商品详情页长列表的代码分离,避免一个类代码成千上万行);水平排列时有翻页效果(电子书经典效果)和滚动效果,常见于各类商业 app。

//
// NNPageController.swift
// SwiftTemplet
//
// Created by Bin Shang on 2020/6/16.
// Copyright © 2020 BN. All rights reserved.
//
import UIKit
///支持水平滚动和垂直滚动
@objcMembers class NNPageController: UIViewController {
var controllers = [UIViewController](){
willSet{
guard let first = newValue.first else { return }
pageController.setViewControllers([first], direction: .forward, animated: false)
}
}
lazy var pageController: UIPageViewController = {
let options = [UIPageViewController.OptionsKey.interPageSpacing: 5,
UIPageViewController.OptionsKey.spineLocation: UIPageViewController.SpineLocation.min
] as [UIPageViewController.OptionsKey : Any]
let pageController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
pageController.dataSource = self
pageController.delegate = self
return pageController
}()
// MARK: -lifecycle
override func viewDidLoad() {
super.viewDidLoad()
addChild(pageController)
pageController.view.frame = view.bounds
view.addSubview(pageController.view)
pageController.didMove(toParent: self)
var list = [UIViewController]()
for idx in 1 ... 5 {
let vc = UIViewController()
vc.view.backgroundColor = UIColor.random
vc.title = "\(idx)"
list.append(vc)
}
controllers = list
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
}
}
extension NNPageController: UIPageViewControllerDataSource {
// func presentationCount(for pageViewController: UIPageViewController) -> Int {
// return controllers.count
// }
//
// func presentationIndex(for pageViewController: UIPageViewController) -> Int {
// guard let controller = pageViewController.viewControllers?.first,
// let index = controllers.firstIndex(of: controller) else { return 0 }
// return index
// }
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
if let index = controllers.firstIndex(of: viewController), index > 0 {
return controllers[index - 1]
}
return nil
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
if let index = controllers.firstIndex(of: viewController), index < controllers.count - 1 {
return controllers[index + 1]
}
return nil
}
}
extension NNPageController: UIPageViewControllerDelegate {
//开始动画
func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
guard let controller = pendingViewControllers.first else { return }
title = controller.title
beginAppearanceTransition(true, animated: true);
endAppearanceTransition();
}
//动画结束
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
if completed == false {
return
}
// guard let controller = previousViewControllers.first else { return }
// beginAppearanceTransition(false, animated: true);
// endAppearanceTransition();
}
//书脊位置
// func pageViewController(_ pageViewController: UIPageViewController, spineLocationFor orientation: UIInterfaceOrientation) -> UIPageViewController.SpineLocation {
// return .mid
// }
// //支持旋转
// func pageViewControllerSupportedInterfaceOrientations(_ pageViewController: UIPageViewController) -> UIInterfaceOrientationMask {
// return [.portrait, .landscapeLeft, .landscapeRight]
// }
// //旋转屏幕
// func pageViewControllerPreferredInterfaceOrientationForPresentation(_ pageViewController: UIPageViewController) -> UIInterfaceOrientation {
// return .portrait
// }
}
网友评论