ios中基于电子书导航的实现

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">要实现一个基于电子书导航的简单应用,我们首先要了解与分页应用相关的视图控制器。涉及到的类有</span><span style="font-family: Arial, Helvetica, sans-serif; color: rgb(255, 0, 0); background-color: rgb(255, 255, 255);">UIPageViewControllerDataSource</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">协议、</span><span style="font-family: Arial, Helvetica, sans-serif; color: rgb(255, 0, 0); background-color: rgb(255, 255, 255);">UIPageViewControllerDelegate</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">协议和</span><span style="font-family: Arial, Helvetica, sans-serif; color: rgb(255, 0, 0); background-color: rgb(255, 255, 255);">UIPageViewController</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">类。而在,UIPageViewController类中没有对应视图类。在一个分页应用中,分页控制器需要放在一个父视图控制器中,而分页控制器下还要有子视图控制器,也就是分页中的每一个页面。</span>

上述的两个协议中数据源协议也就是DataSource有必须要实现的两个方法

  • pageViewController:viewControllerBeforeViewController:。返回当前视图控制器的上一个视图控制器,用于上一个页面的显示。
  • pageViewController:viewControllerAfterViewController:。返回当前视图控制器的下一个视图控制器,用于下一个页面的显示。

在委托协议中比较重要的方法为pageViewController:spineLocationForInterfaceOrientation: ,它根据屏幕旋转方向设置书脊位置并且用来初始化首页: 

  • 双面显示。即当对应参数doubleSided设置为“真”时,翻页时,页面的背面是下一面的内容;当设置为“假”时,单页翻起时,页面的背面内容是翻起的面的镜像显示。
  • 书脊位置。书脊位置属性是只读的,需要对他进行设置。通过该方法设置书脊位置,而书脊位置有UIPageViewControllerSpineLocation定义,是枚举变量。该枚举变量中分别有Min(书脊位置在最左或最上,翻页方向自右向左或自下向上)、Max(书脊位置在最右或最下,翻页方向自左向右或自上向下)、Mid(书脊位置在中间,一般适用于IPad的横屏模式,屏幕分成两个页面如书摊开状)。
了解了这些之后我们开始创建工程。在工程中,除了用于父视图控制器的viewcontroller之外,我们还可以多拖入几个ViewController,并对每一个新添加的在标识检查器中设置不同的有序的Storyboard ID,如page1、page2...等等。又由于这些新添加的视图控制器,我们没有动作响应只做显示用途,故无需添加对应的类文件。设置完毕后,我们开始添加代码。
  1. 定义全局的一个枚举类型DirectionForward: Int { case Before = 1 ; case After = 2}。在后面我们将利用它来保存翻页时反馈的方向。在父视图控制器类内定义的属性
    	var pageIndex = 0 //当前页面的索引
    	var directionForward = DirectionForward.After   //初始化一个方向
    	var pageViewController: UIPageViewController!	//定义一个分页控制器

  2. 在viewDidLoad()中,我们需要初始化一些信息。代码如下,分别是创建了分页视图控制器的实例,将数据源和委托与分页视图控制器绑定,根据Storyboard ID取出第一个视图控制器作为电子书首页,设置分页视图控制器,并将其加入父视图控制器。
     <span style="white-space:pre">	</span>//创建uipageviewcontroller实例
            self.pageViewController = UIPageViewController(transitionStyle: .PageCurl, navigationOrientation: .Horizontal, options: nil)
            
            self.pageViewController.delegate = self
            self.pageViewController.dataSource = self
            
            //取出第一个视图控制器,将其作为pageviewcontroller的首页
            let mainStoryboard = self.storyboard!
            let page1ViewController = mainStoryboard.instantiateViewControllerWithIdentifier("page1")
            
            let viewControllers: Array = [page1ViewController]
            self.pageViewController.setViewControllers(viewControllers, direction: .Forward, animated: true, completion: nil)
            
            self.view.addSubview(self.pageViewController.view)

  3. 实现数据源协议方法和委托协议部分方法。
  • pageViewController:viewControllerBeforeViewController:中,当反馈为向前翻时,pageIndex索引-1,若索引-1后小于0,则直接返回空,否则将翻页方向设置为.Before,并且将前一页视图控制器取出并返回;
  • 同样,在pageViewController:viewControllerAfterViewController:中,当反馈为向后翻时,调用该函数,pageIndex+1,若+1后索引大于最大页数-1,则直接返回空,否则,将翻页方向设为.After,并将下一页视图控制器取出并返回。
  • pageViewController:spineLocationForInterfaceOrientation:中将pageViewController的doubleSided属性设置为false,即单面显示(也可设为双面)。并返回一种书脊位置Min(Max、Mid)。
  • 还有一个重要的委托协议方法pageViewController:didFinishAnimating:。即当用户翻页动作完成时,才调用该函数。如果动作完成,参数列表中的completed将返回true,否则返回false。如果用户放弃翻页,即false,我们需要将索引pageIndex恢复为翻页前的值。具体恢复根据其翻页方向进行加减。
至此,一个简单的基于电子书导航的应用就完成了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值