swift:簡單使用翻頁控制器UIPageViewController


一、小敘

UIPageViewController是一個實現圖書閱讀的控制器,使用它可以設置書脊位置、單雙頁、過渡效果等,它是通過代理的方式來實現翻頁,也即上一頁、下一頁。最終這個UIPageViewController被包裝后添加到當前控制器即可。

 

二、直接上代碼

//
//  ViewController.swift
//  PageViewControllerDemo
//
//  Created by 夏遠全 on 2017/1/19.
//  Copyright © 2017年 夏遠全. All rights reserved.
//

import UIKit

class ViewController: UIViewController,UIPageViewControllerDelegate,UIPageViewControllerDataSource {
    
    //定義UIPageViewController和內容數組
    var pageController:UIPageViewController!
    var pageContent:[String] = [String]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //初始化UIPageViewController
        //transitionStyle: 翻頁效果(卷起來翻卷、水平活動翻卷)
        //navigationOrientation:翻頁方向(水平方向、豎直方向)
        //options: 這是一個字典,設置翻頁控制器的書脊位置(none/min/mid/max)
        pageController = UIPageViewController.init(transitionStyle: .pageCurl, navigationOrientation: .horizontal, options: [UIPageViewControllerOptionSpineLocationKey:NSNumber(value:UIPageViewControllerSpineLocation.min.rawValue)])
        pageController.view.frame = self.view.bounds
        
        //設置代理,提供展示相關的信息和接收手勢發起的轉換的通知
        pageController.delegate = self
        
        //設置數據源,提供展示的內容
        pageController.dataSource = self
        
        //創建顯示內容
        self.createContentPages()
        
        //初始化內容控制器
        let initalViewController = self.viewControllerAtIndex(index: 0)
        pageController.setViewControllers([initalViewController!], direction: .forward, animated: false) { (b:Bool) in
            
            //UIPageController必須放在Controller Container中
            self.addChildViewController(self.pageController)
            self.view.addSubview(self.pageController.view)
            self.pageController.didMove(toParentViewController: self)
        }
    }
    
    //自定義方法,創建顯示視圖
    func viewControllerAtIndex(index:Int) -> ContentViewController? {
        if self.pageContent.count == 0 || index > self.pageContent.count {
            return nil
        }
        let dataViewController = ContentViewController()
        dataViewController.dataObject = self.pageContent[index]
        dataViewController.loadHTMLContent()
        return dataViewController
    }
    
    //自定義方法,獲取viewController的頁碼
    func indexOfViewController(viewControler:ContentViewController) -> Int {
        return self.pageContent.index(of: viewControler.dataObject!)!
    }
    
    //自定義方法,創建顯示內容
    func createContentPages() -> Void {
        
        for i in 1..<11 {
            let contentString = "<html><head></head><body><h1>《俠客行》</h1><p>第\(i)頁</p></body></html>"
            pageContent.append(contentString)
        }
    }
    
    //實現UIPageViewControllerDeleagte代理方法
    //將要翻頁
    func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
        print("started")
    }
    //翻頁結束
    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
        print("finished")
    }
    //設置書脊位置
    func pageViewController(_ pageViewController: UIPageViewController, spineLocationFor orientation: UIInterfaceOrientation) -> UIPageViewControllerSpineLocation {
        return .min
    }
    //設置設備支持方向
    func pageViewControllerSupportedInterfaceOrientations(_ pageViewController: UIPageViewController) -> UIInterfaceOrientationMask {
        return .all
    }
    //設置優選方向
    func pageViewControllerPreferredInterfaceOrientationForPresentation(_ pageViewController: UIPageViewController) -> UIInterfaceOrientation {
        return .portrait
    }
    
    //實現UIPageViewControllerDataSource數據源方法
    //返回總頁數
    func presentationCount(for pageViewController: UIPageViewController) -> Int {
        return self.pageContent.count
    }
    //向前翻頁
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        
        //獲取當前viewController的頁碼
        var index:Int = self.indexOfViewController(viewControler: viewController as! ContentViewController)
        
        //如果是第0頁,返回nil
        if index == 0 || (index == NSNotFound) {
            return nil
        }
        
        index -= 1
        
        return self.viewControllerAtIndex(index: index)
    }
    //向后翻頁
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
       
        //獲取當前viewController的頁碼
        var index:Int = self.indexOfViewController(viewControler: viewController as! ContentViewController)
        
        if index == NSNotFound {
            return nil
        }
        
        index += 1
        
        //如果是最后一張,返回nil
        if index == self.pageContent.count {
            return nil
        }
        
        return self.viewControllerAtIndex(index: index)
    }
}

 

 

三、效果(點擊屏幕實現翻頁)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM