美文网首页
iOS 重构解耦: UIPageViewController

iOS 重构解耦: UIPageViewController

作者: SoaringHeart | 来源:发表于2020-06-17 12:50 被阅读0次

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

ezgif.com-video-to-gif (1).gif
//
//  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
//    }

}

相关文章

网友评论

      本文标题:iOS 重构解耦: UIPageViewController

      本文链接:https://www.haomeiwen.com/subject/ruzjxktx.html