iOS-UIPageViewController实现分页控件

屏幕截图

使用UIPageViewController去实现这种滚动分页的控制,我们可以忽略比如view的复用,scroll的各种计算,我们只需要少量的代码就可以实现一个高性能的分页控件 我们只需要实现UIPageViewController的两个数据源代理即可

func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        guard let index = (viewController as? DetailViewController)?.index else {
            return nil
        }
        if index == 0 {
            return nil
        }
        return self.dataSource?.previewController(formPage: index - 1)
}

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        guard let index = (viewController as? DetailViewController)?.index else {
            return nil
        }
        if index == number - 1 {
            return nil
        }
        return self.dataSource?.previewController(formPage: index + 1)
}

这两个代理,一个是向前翻页,一个是向后翻页 我们需要注意的是,我们不能用一个属性来计算将要展示的页面,因为有可能翻页时两个代理都会被调用,这样就很容易计算出错 所以我们把页面存储在显示的页面中,这样当需要翻页时,再取出当前页面的页码,再计算下一个界面的页码 那么我们怎么将当前的页码赋值给全局变量呢?可以通过下面的代理

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
        self.index = (pageViewController.viewControllers?.first as? DetailViewController)?.index ?? 0
        if index < buttons.count {
            self.selected(buttons[index])
        }
}

该代理将会在翻页完成时调用,此时我们取出当前页面,就知道当前的页码了,然后再通过当前的页码来控制标题的变化,这样一个简单的分页控件就完成了

Demo地址:https://github.com/cdcyd/CommonControlsCollection

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2tm0dqtdhdr5

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏web前端教室

农历2016年最后一次先行者群视频

今天是周日,也是农历2016年最后一次先行者群视频课程,然后就是春节了,提前祝大家春节快乐。下次课程就要在2月才开始。 ? 如上图,从2016年二三月吧,开始到...

1707
来自专栏陈帅的专栏

Android 性能测试之内存性能及内存泄漏篇

APP 占用内存的测试,要比 CPU 的更为简单。App memory 数据来源是 dumpsysmeminfo 。Android 程序内存主要是两部分:nat...

2480
来自专栏LeoXu的博客

[翻译]使用 Velocity 构建一个稳定安全的Web应用

<p> draft document -- 2003年6月11日 </p> <p> 作为一名web开发者,任何时候当你构建一个Web应用时,有责任确保你的应用程...

822
来自专栏木子昭的博客

Django快速分页在后端(视图函数中)在前端(html模板中)

分页 在web开发中,对大量的商品进行分页显示,是常见的需求,django对分页直接提供了现成的函数,让我们的开发更为快速便捷... 动图_Django快...

3399
来自专栏杂七杂八

实现登录框

今天课程要求实现百度的登录框功能,晚上花费了两个小时终于搞定,直接上代码 <!DOCTYPE html> <html lang="en"> <head> ...

2956
来自专栏pangguoming

一看就懂的ReactJs入门教程(精华版)

现在最热门的前端框架有AngularJS、React、Bootstrap等。自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件...

3526
来自专栏xingoo, 一个梦想做发明家的程序员

【AngularJS】—— 13 服务Service

在AngularJS中有很多的服务,常用的比如$http,$location等等。 本篇文章会介绍一下的内容:   1 $http这种Angular提供的...

2125
来自专栏码洞

求不更学不动之Redis5.0新特性Stream尝鲜

Redis5.0最近被作者突然放出来了,增加了很多新的特色功能。而Redis5.0最大的新特性就是多出了一个数据结构Stream,它是一个新的强大的支持多播的可...

982
来自专栏鬼谷君

python3 调用 salt-api

1583
来自专栏Golang语言社区

棋牌游戏服务器架构: 详细设计(一) 内核设计

内核的几个组件被设计成Service,也就是说这几个模块都要实现如下接口: ? 图1 IService接口 Start方法用来启动服务。 ...

3134

扫码关注云+社区