ios - swift:如何创建 UIPageViewController?

标签 ios swift

我想创建具有脊柱中间位置的UIPageViewController。我阅读了一些关于 UIPageViewController 的教程,但在本教程中使用了脊柱最小或最大位置。我无法创建具有脊柱中间位置的 UIPageViewController

我有这个函数来创建带有脊柱中间位置最小或最大位置的UIPageViewController:

func createPageViewController() {

            // Instantiate the PageViewController
            let pageController = self.storyboard?.instantiateViewController(withIdentifier: "PageViewController") as! UIPageViewController
            pageController.dataSource = self
            pageController.delegate = self

            if images.count > 0{
                let contentController = getContentViewController(withIndex: 0)!
                let contentControllers = [contentController]

                pageController.setViewControllers(contentControllers, direction: UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil)

            }

            pageViewController = pageController

            self.addChildViewController(pageViewController!)

            self.view.addSubview(pageViewController!.view)
            pageViewController!.didMove(toParentViewController: self)

        }

我尝试对此进行更改:

let contentController = getContentViewController(withIndex: 0)!
let contentController1 = getContentViewController(withIndex: 1)!
let contentControllers = [contentController, contentController1]

但在这种情况下,我的图像没有显示在页面中。这没有帮助。我究竟做错了什么?如何创建具有脊柱中间位置的UIPageViewController

更新

import UIKit

class PageViewController: UIViewController {

    @IBOutlet weak var PageControl: UIPageControl!

    var pageViewController: UIPageViewController?
    var images = ["book1page1.png","book1","book1","book1page2.png","book1page1.png","book1page2.png"]
    var pendingIndex: Int?

    override func viewDidLoad() {
        super.viewDidLoad()

        createPageViewController()
        setupPageControll()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func createPageViewController() {
        // Instantiate the PageViewController
        let pageController = self.storyboard?.instantiateViewController(withIdentifier: "PageViewController") as! UIPageViewController
        pageController.dataSource = self
        pageController.delegate = self

        if images.count > 0{
            let firstController = getContentViewController(withIndex: 0)!
            let contentControllers = [firstController]

            pageController.setViewControllers(contentControllers, direction: UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil)

        }

        pageViewController = pageController

        self.addChildViewController(pageViewController!)

        //self.view.addSubview(pageViewController!.view)
        self.view.insertSubview(pageViewController!.view, at: 0)
        pageViewController!.didMove(toParentViewController: self)

    }

    //Setup Pagination Icons and count
    func presentationCount(for pageViewController: UIPageViewController) -> Int {
        return images.count
    }

    func presentationIndex(for pageViewController: UIPageViewController) -> Int {
        return 0
    }

    func setupPageControll(){
        let apperance = UIPageControl.appearance()
        apperance.pageIndicatorTintColor = UIColor.gray
        apperance.currentPageIndicatorTintColor = UIColor.white
        apperance.backgroundColor = UIColor.clear
    }

    func currentControllerIndex() -> Int{
        let pageItemController = self.currentConroller()

        if let controller = pageItemController as? ContentViewController {
            return controller.itemIndex
        }
        return -1
    }

    ///////////////////////////////////////////////

    func currentConroller() -> UIViewController?{
        if (self.pageViewController?.viewControllers?.count)! > 0{
            return self.pageViewController?.viewControllers![0]
        }

        return nil
    }

    func getContentViewController(withIndex index: Int) -> ContentViewController? {
        if index < images.count{
            let contentVC = self.storyboard?.instantiateViewController(withIdentifier: "ContentViewController") as! ContentViewController
            contentVC.itemIndex = index
            contentVC.imageName = images[index]

            return contentVC
        }

        return nil
    }

}

extension PageViewController: UIPageViewControllerDataSource, UIPageViewControllerDelegate {

    func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
        pendingIndex = (pendingViewControllers.first as! ContentViewController).itemIndex
    }

    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
        if completed {
            let currentIndex = pendingIndex
            if let index = currentIndex {
                self.PageControl.currentPage = index
            }

        }
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        let contentVC = viewController as! ContentViewController
        if contentVC.itemIndex > 0 {
            return getContentViewController(withIndex: contentVC.itemIndex - 1)
        }

        return nil
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        let contentVC = viewController as! ContentViewController
        if contentVC.itemIndex + 1 < images.count {
            return getContentViewController(withIndex: contentVC.itemIndex + 1)
        }

        return nil
    }
}

最佳答案

在 Storyboard上选择 PageViewController 并进行设置。脊柱位置 noneMid。另请检查双面

enter image description here

修改您的代码如下。 (对您自己的代码进行的更改)

import UIKit

class PageViewController: UIViewController {

    @IBOutlet weak var PageControl: UIPageControl!

    var pageViewController: UIPageViewController?
    var images = ["01","02","03","04"]
    var pendingIndex: Int?

    override func viewDidLoad() {
        super.viewDidLoad()
        createPageViewController()
        setupPageControll()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func createPageViewController() {
        let pageController = self.storyboard?.instantiateViewController(withIdentifier: "PageViewController") as! UIPageViewController

        pageController.isDoubleSided = true
        pageController.dataSource = self
        pageController.delegate = self

        if images.count > 1{
            let firstController = getContentViewController(withIndex: 0)!
            let secondController = getContentViewController(withIndex: 1)!
            let contentControllers = [firstController,secondController]
            pageController.setViewControllers(contentControllers, direction: UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil)

        }

        pageViewController = pageController
        self.addChildViewController(pageViewController!)
        self.view.insertSubview(pageViewController!.view, at: 0)
        pageViewController!.didMove(toParentViewController: self)

    }

    //Setup Pagination Icons and count
    func presentationCount(for pageViewController: UIPageViewController) -> Int {
        return images.count
    }

    func presentationIndex(for pageViewController: UIPageViewController) -> Int {
        return 0
    }

    func setupPageControll(){
        let apperance = UIPageControl.appearance()
        apperance.pageIndicatorTintColor = UIColor.gray
        apperance.currentPageIndicatorTintColor = UIColor.white
        apperance.backgroundColor = UIColor.clear
    }

    func currentControllerIndex() -> Int{
        let pageItemController = self.currentConroller()

        if let controller = pageItemController as? ContentView {
            return controller.itemIndex
        }
        return -1
    }

    ///////////////////////////////////////////////

    func currentConroller() -> UIViewController?{
        if (self.pageViewController?.viewControllers?.count)! > 0{
            return self.pageViewController?.viewControllers![0]
        }

        return nil
    }

    func getContentViewController(withIndex index: Int) -> ContentView? {
        if index < images.count{
            let contentVC = self.storyboard?.instantiateViewController(withIdentifier: "ContentViewController") as! ContentView
            contentVC.itemIndex = index
            //contentVC.imageName.image = self.images[index]

            return contentVC
        }

        return nil
    }

}

extension PageViewController: UIPageViewControllerDataSource, UIPageViewControllerDelegate {

    func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
        pendingIndex = (pendingViewControllers.first as! ContentView).itemIndex
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {

        let contentVC = viewController as! ContentView

        if contentVC.itemIndex > 0 {
            return getContentViewController(withIndex: contentVC.itemIndex - 1)
        }

        return nil
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        let contentVC = viewController as! ContentView
        if contentVC.itemIndex + 1 < images.count {
            return getContentViewController(withIndex: contentVC.itemIndex + 1)
        }

        return nil
    }
}

Github Full Project .

关于ios - swift:如何创建 UIPageViewController?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51358187/

相关文章:

ios - 无法从IOS中的plist文件读取字典数据

ios - UIView 子类(自定义进度 View )不会显示,直到为时已晚

ios - 以编程方式处理旋转 UIView

ios - 使用日期字符串Swift解析大型json数据时的CPU使用率高

swift - 无法创建同名的实例变量和类变量

ios - RealmSwift 需要重建。有我可以下载的更新吗?

ios - 如何从 NSString 中删除十六进制字符

ios - 在 iOS 中,如何获取 self 的地址作为字符串?

ios - Swift 将 NSNumber 对象转换为 Double

swift - 使用 Swift 将天/小时添加到 NSDate