swift:简单使用翻页控制器UIPageViewController

本文涉及的产品
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
数据可视化 DataV(企业版),20 个大屏 1 个月
简介:

一、小叙

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 ,如需转载请自行联系原作者
相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
Swift
Swift和OC控制器互相跳转
Swift和OC控制器互相跳转
336 0
|
Swift
Swift - 用装有控制器name的数组for循环批量创建控制器(string转UIViewController)
Swift - 用装有控制器name的数组for循环批量创建控制器(string转UIViewController)
112 0
|
Swift
swift微博第15天(新版的判断以及跟控制器的切换)
swift微博第15天(新版的判断以及跟控制器的切换)
186 0
swift微博第15天(新版的判断以及跟控制器的切换)
|
JSON Swift 数据格式
swift微博第3天(动态加载控制器)
swift微博第3天(动态加载控制器)
122 0
swift微博第3天(动态加载控制器)
|
Swift
swift微博第2天(命名空间和控制器字符串)
swift微博第2天(命名空间和控制器字符串)
158 0
swift微博第2天(命名空间和控制器字符串)
|
7月前
|
Unix 调度 Swift
苹果iOS新手开发之Swift 中获取时间戳有哪些方式?
在Swift中获取时间戳有四种常见方式:1) 使用`Date`对象获取秒级或毫秒级时间戳;2) 通过`CFAbsoluteTimeGetCurrent`获取Core Foundation的秒数,需转换为Unix时间戳;3) 使用`DispatchTime.now()`获取纳秒级精度的调度时间点;4) `ProcessInfo`提供设备启动后的秒数,不表示绝对时间。不同方法适用于不同的精度和场景需求。
226 3
|
3月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
72 2
|
3月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
94 1