关于UIPageViewController那些事
一、前言
这些天有新生问及UIPageViewController这个视图控制器,自己原来没有用过,所以就看了一下相关的知识,就写了下来,分享一下经验。
主要的关于这个控制器的内容就从例子中去解说了。
再插一句:这个UIPageViewController一般用于引导页,就是第一次打开软件的时候显示的滑动页简介等。
二、最终效果



三、制作步骤:
第一步:我们首先新建一个SingleViewApplication。然后打开storyboard,在storyboard中 拖进来一个UIViewController 和一个UIPageViewController.如下图所示:

第二步:新建一个PageContentViewController,它是继承与UIViewController,这个视图用于控制显示的内容,同时设置刚才拖到storyboard中的UIViewController的class为PageContentViewController


同时设置Storyboard ID为PageContentController(可以随便设置),同时也设置刚才拖到storyboard的UIPageViewController的storyboard ID为PageViewController
,如上图所示。
第三步:在storyboardb中,在PageContentViewController中添加控件UILabel.并定义输出口。

在PageContentViewController.h中代码如下:
#import <UIKit/UIKit.h> @interface PageContentViewController : UIViewController @property(nonatomic,assign)NSUInteger pageIndex; //当前页面索引值 @property(nonatomic,strong)NSString *titleText; @property (weak, nonatomic) IBOutlet UILabel *contentLabel; @end
其中,pageIndex用来标识当前页的索引值,就是当前页面显示的第几页的页码。titleText就是contentLabel的内容。这时,在PageContentViewController.m中代码如下:
#import "PageContentViewController.h"
@interface PageContentViewController ()
@end
@implementation PageContentViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.contentLabel.text = self.titleText;
}
@end
我们把titleText的内容给contentLabel。
接下来就是重头戏了。
第四步:我们在ViewController中(系统初始时的那个ViewController),新建一个NSArray用于盛放每一页显示的内容,即titleText的值数组。然后再实例化一个UIPageViewController。最后在ViewController中实现代理。
ViewController.h中代码如下:
#import <UIKit/UIKit.h> #import "PageContentViewController.h" @interface ViewController : UIViewController<UIPageViewControllerDataSource> @property(nonatomic,strong)NSArray *pageTitles; @property(nonatomic,strong)UIPageViewController *pageViewController; @end
第五步:主要在ViewController.m中操作:
1、实例化pageTitles:
self.pageTitles = [[NSArray alloc] initWithObjects:@"我是第一页",@"我是第二页",@"我是第三页",@"我是第四页", nil];
2、实例化pageViewController:
self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController”];
这里用storyboard初始化该pageViewController。PageViewController为拖到storyboard中的UIPageViewController的storyboard ID。
3、实现协议:
self.pageViewController.dataSource = self;
在该类中主要有一下几种方法:
1、
-(PageContentViewController *)vidwControllerAtIndex:(NSUInteger)index
{
if (self.pageTitles.count== || index>=self.pageTitles.count) {
return nil;
}
PageContentViewController *pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentController"];
pageContentViewController.view.backgroundColor = [UIColor lightGrayColor];
pageContentViewController.contentLabel.text = self.pageTitles[index];
pageContentViewController.pageIndex = index;
return pageContentViewController;
}
刚开始看这个方法好像很复杂的样子,其实很简单。就是根据index去得到想要显示的PageContentViewController.如果index=0或者超过了最大的页数,就返回空。
如果index没有越界,就实例话一个PageContentViewController,然后设置背景色,设置显示的页面的contentLabel.text,设置pageContentViewController的pageIndex。然后返回设置好的pageContentViewController。
2、
#pragma mark - PageViewControllerDataSource
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
NSUInteger index = ((PageContentViewController *)viewController).pageIndex;
if (index==||index==NSNotFound) {
return nil;
}
index--;
return [self vidwControllerAtIndex:index];
}
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
NSUInteger index =((PageContentViewController *)viewController).pageIndex;
if (index==NSNotFound) {
return nil;
}
index++;
if (index==[self.pageTitles count]) {
return nil;
}
return [self vidwControllerAtIndex:index];
}
//显示点的数量
-(NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
{
// NSLog(@"%lu",(unsigned long)self.pageTitles.count);
return [self.pageTitles count];
}
//初始化选择哪一页
-(NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
{
return ;
}
很明显,这两个是UIPageViewController的代理方法。第一个是用于加载前一个pageContentController,该代理方法在向右滑动的时候触发。第二个是用于加载后一个pageContentController,该代理方法在向左滑动时触发。
就拿第一个来说吧。首先得到将要显示的viewController的pageIndex。因为需要判断是否到达第一个viewController.首先得到index,然后判断。然后加载要显示的页。
第二个方法是用于加载后一个viewController,其操作与第一个相反。就不多说了。
再后面的那两个方法一个用来设置需要显示的页数,一个用于设置初始化显示的第几页。
然后你可能会疑惑我们的显示内容的viewController是怎么加载到当前的页面的呢?其实也很简单。主要用到了下面的几个方法:(在viewdidload中)
PageContentViewController *startingViewController = [self vidwControllerAtIndex:];
NSArray *viewControllers = @[startingViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
self.pageViewController.view.frame = CGRectMake(, , self.view.frame.size.width, self.view.frame.size.height-);
[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];
[self.pageViewController didMoveToParentViewController:self];
因为我们只是用了一个PageContentViewController,所以先得到该pageContentViewController。然后装入数组。
下面这个方法:
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForwardanimated:NO completion:nil];
其作用就是把所有的pageContentViewContoller放到self.pageViewController。然后设置The navigation direction.
然后设置pageViewController的frame大小。
[self addChildViewController:self.pageViewController];这个方法是用于把pageViewController作为当前controller的子controller。 [self.view addSubview:self.pageViewController.view];把pageViewController的view加载到当前控制器的view上。 [self.pageViewController didMoveToParentViewController:self];这个方法感兴趣的可以自己查一下.
第六步:
运行你会发现没有下面的导航点,进行如下设置即可:
在AppDelegate.m中:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
UIPageControl *pageControl = [UIPageControl appearance];
pageControl.pageIndicatorTintColor = [UIColor lightGrayColor];
pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
pageControl.backgroundColor = [UIColor whiteColor];
return YES;
}
第七步:完成。
附viewController.m的源码:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.pageTitles = [[NSArray alloc] initWithObjects:@"我是第一页",@"我是第二页",@"我是第三页",@"我是第四页", nil];
self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"];
self.pageViewController.dataSource = self;
PageContentViewController *startingViewController = [self vidwControllerAtIndex:];
NSArray *viewControllers = @[startingViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];
self.pageViewController.view.frame = CGRectMake(, , self.view.frame.size.width, self.view.frame.size.height-);
[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];
[self.pageViewController didMoveToParentViewController:self];
}
#pragma mark - PageViewControllerDataSource
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
NSUInteger index = ((PageContentViewController *)viewController).pageIndex;
if (index==||index==NSNotFound) {
return nil;
}
index--;
return [self vidwControllerAtIndex:index];
}
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
NSUInteger index =((PageContentViewController *)viewController).pageIndex;
if (index==NSNotFound) {
return nil;
}
index++;
if (index==[self.pageTitles count]) {
return nil;
}
return [self vidwControllerAtIndex:index];
}
-(PageContentViewController *)vidwControllerAtIndex:(NSUInteger)index
{
if (self.pageTitles.count== || index>=self.pageTitles.count) {
return nil;
}
PageContentViewController *pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentController"];
pageContentViewController.view.backgroundColor = [UIColor lightGrayColor];
pageContentViewController.contentLabel.text = self.pageTitles[index];
pageContentViewController.pageIndex = index;
return pageContentViewController;
}
//显示点的数量
-(NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
{
// NSLog(@"%lu",(unsigned long)self.pageTitles.count);
return [self.pageTitles count];
}
//初始化选择哪一页
-(NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
{
return ;
}
@end
关于UIPageViewController那些事的更多相关文章
- 如何使用Storyboard创建UIPageViewController
之前我们已经讲过UIPageViewController,那篇文章演示了如何使用Interface Builder创建UIPageViewController.为了适配iOS7和Xcode5,我们重新 ...
- 【腾讯Bugly干货分享】H5 视频直播那些事
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57a42ee6503dfcb22007ede8 Dev Club 是一个交流移动 ...
- CSharpGL(31)[译]OpenGL渲染管道那些事
CSharpGL(31)[译]OpenGL渲染管道那些事 +BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一 ...
- TODO:字节的那点事Go篇
TODO:字节的那点事Go篇 (本文go version go1.7.3 darwin/amd64) 在Golang中string底层是由byte数组组成的. fmt.Println(len(&quo ...
- Microsoft Visual Studio 2013 — Project搭载IIS配置的那些事
前段时间在改Bug打开一个project时,发生了一件奇怪的事,好好的一直不能加载solution底下的这个project,错误如下图所示:大致的意思就是这个project的web server被配置 ...
- OpenNLP:驾驭文本,分词那些事
OpenNLP:驾驭文本,分词那些事 作者 白宁超 2016年3月27日19:55:03 摘要:字符串.字符数组以及其他文本表示的处理库构成大部分文本处理程序的基础.大部分语言都包括基本的处理库,这也 ...
- HTTPS那些事(一)HTTPS原理
转载来自:http://www.guokr.com/post/114121/ 谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行网络加密传 ...
- 做一个 App 前需要考虑的几件事
做一个 App 前需要考虑的几件事 来源:limboy的博客 随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 ...
- Ctrl-A全选这点事(C#,WinForm)
所有的文本框,不管单行多行都Ctrl-A全选就好了吧?是啊,很方便.Windows的软件基本都是这样.可为什么我们自己制作的WinForm就默认不是这样呢?谁知道呢,可能是WinForm饱受诟病,要改 ...
随机推荐
- 谈谈对JVM的理解
JVM可谓是学习JAVA基础中的基础了,但仍有不少同学对JVM概念还是比较模糊,甚至没有听说过,对java的理解也只是在基础语法 层面,本文就将对JVM进行初步介绍,因篇幅所限,只能介 ...
- SQL 必知必会·笔记<11>创建高级联结
1. 使用表别名 SQL 除了可以对列名和计算字段使用别名,还允许给表名起别名.这样 做有两个主要理由: 缩短SQL 语句: 允许在一条SELECT 语句中多次使用相同的表. 使用表别名示例: SEL ...
- Java第三方支付接入案例(支付宝)
开源项目链接 Kitty 开源权限管理系统 项目地址:https://gitee.com/liuge1988/kitty 演示地址:http://139.196.87.48:9002/kitty 用户 ...
- Zuul过滤器
1.Zuul过滤器生命周期Zuul大部分功能都是通过过滤器来实现的,Zuul定义了4种标准的过滤器类型,这些过滤器类型对应于请求的典型生命周期.a.pre: 这种过滤器在请求被路由之前调用.可利用这种 ...
- Codeforces/TopCoder/ProjectEuler/CodeChef 散题笔记 (持续更新)
最近做到了一些有趣的散题,于是开个Blog记录一下吧… (如果有人想做这些题的话还是不要看题解吧…) 2017-03-16 PE 202 Laserbeam 题意:有一个正三角形的镜子屋,光线从$C$ ...
- Java的赋值、浅克隆和深度克隆的区别
赋值 直接 = ,克隆 clone 假如说你想复制一个简单变量.很简单: int a= 5; int b= a; b = 6; 这样 a == 5, b == 6 不仅仅是int类型,其它七种原始数 ...
- show profiles 分析sql耗时瓶颈
1.首先查看是否开启profiling功能 SHOW VARIABLES LIKE '%pro%'; 或者 SELECT @@profiling; 2.开启profiling ; 3.执行sql语句例 ...
- python 浅析模块,包及其相关用法
今天买了一本关于模块的书,说实话,模块真的太多了,小编许多也不知道,要是把模块全讲完,可能得出本书了,所以小编在自己有限的能力范围内在这里浅析一下自己的见解,同时讲讲几个常用的模块. 这里是2018. ...
- spring cloud config服务器
Spring Cloud Config提供了一种在分布式系统中外部化配置服务器和客户端的支持.配置服务器有一个中心位置,管理所有环境下的应用的外部属性.客户端和服务器映射到相同Spring Event ...
- eclipse中安装windowbuilder插件、应用及卸载
一.安装windowbuilder插件 1.找到对应版本的windowbuilder 连接地址:http://www.eclipse.org/windowbuilder/download.php 如图 ...