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)
    }
}
复制代码

 

 

三、效果(点击屏幕实现翻页)

 

 

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/6406532.html ,如需转载请自行联系原作者
相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
Swift
Swift和OC控制器互相跳转
Swift和OC控制器互相跳转
287 0
|
Swift
Swift - 用装有控制器name的数组for循环批量创建控制器(string转UIViewController)
Swift - 用装有控制器name的数组for循环批量创建控制器(string转UIViewController)
74 0
|
Swift
swift微博第15天(新版的判断以及跟控制器的切换)
swift微博第15天(新版的判断以及跟控制器的切换)
144 0
swift微博第15天(新版的判断以及跟控制器的切换)
|
JSON Swift 数据格式
swift微博第3天(动态加载控制器)
swift微博第3天(动态加载控制器)
99 0
swift微博第3天(动态加载控制器)
|
Swift
swift微博第2天(命名空间和控制器字符串)
swift微博第2天(命名空间和控制器字符串)
114 0
swift微博第2天(命名空间和控制器字符串)
|
3月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
91 2
|
2月前
|
监控 API Swift
用Swift开发iOS平台上的上网行为管理监控软件
在当今数字化时代,随着智能手机的普及,人们对于网络的依赖日益增加。然而,对于一些特定场景,如家庭、学校或者企业,对于iOS设备上的网络行为进行管理和监控显得尤为重要。为了满足这一需求,我们可以利用Swift语言开发一款iOS平台上的上网行为管理监控软件。
196 2
|
3月前
|
监控 Swift iOS开发
局域网计算机监控软件中利用Swift构建iOS端的移动监控应用
在局域网计算机监控软件的开发中,构建iOS端的移动监控应用是一项关键任务。本文将介绍如何利用Swift语言实现这一目标,通过多个代码示例展示关键功能的实现。
225 1

相关课程

更多