一、前言

这些天有新生问及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那些事的更多相关文章

  1. 如何使用Storyboard创建UIPageViewController

    之前我们已经讲过UIPageViewController,那篇文章演示了如何使用Interface Builder创建UIPageViewController.为了适配iOS7和Xcode5,我们重新 ...

  2. 【腾讯Bugly干货分享】H5 视频直播那些事

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57a42ee6503dfcb22007ede8 Dev Club 是一个交流移动 ...

  3. CSharpGL(31)[译]OpenGL渲染管道那些事

    CSharpGL(31)[译]OpenGL渲染管道那些事 +BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一 ...

  4. TODO:字节的那点事Go篇

    TODO:字节的那点事Go篇 (本文go version go1.7.3 darwin/amd64) 在Golang中string底层是由byte数组组成的. fmt.Println(len(&quo ...

  5. Microsoft Visual Studio 2013 — Project搭载IIS配置的那些事

    前段时间在改Bug打开一个project时,发生了一件奇怪的事,好好的一直不能加载solution底下的这个project,错误如下图所示:大致的意思就是这个project的web server被配置 ...

  6. OpenNLP:驾驭文本,分词那些事

    OpenNLP:驾驭文本,分词那些事 作者 白宁超 2016年3月27日19:55:03 摘要:字符串.字符数组以及其他文本表示的处理库构成大部分文本处理程序的基础.大部分语言都包括基本的处理库,这也 ...

  7. HTTPS那些事(一)HTTPS原理

    转载来自:http://www.guokr.com/post/114121/ 谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行网络加密传 ...

  8. 做一个 App 前需要考虑的几件事

    做一个 App 前需要考虑的几件事  来源:limboy的博客   随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 ...

  9. Ctrl-A全选这点事(C#,WinForm)

    所有的文本框,不管单行多行都Ctrl-A全选就好了吧?是啊,很方便.Windows的软件基本都是这样.可为什么我们自己制作的WinForm就默认不是这样呢?谁知道呢,可能是WinForm饱受诟病,要改 ...

随机推荐

  1. PHP多个进程同时写入同一个文件

    flock (PHP 3 >= 3.0.7, PHP 4, PHP 5) flock -- 轻便的咨询文件锁定 说明 bool flock ( int handle, int operation ...

  2. 【学习笔记】JS经典异步操作,从闭包到async/await

    参考文献:王仕军——知乎专栏前端周刊 感谢作者的热心总结,本文在理解的基础上,根据自己能力水平作了一点小小的修改,在加深自己印象的同时也希望能和各位共同进步... 1. 异步与for循环 抛出一个问题 ...

  3. Python和Java编程题(五)

    题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的 ...

  4. HAPRoxy(一):HAProxy基本配置、调度算法与tcp、http、heath模式配置示例

    一.HAProxy安装 1.HAProxy简单介绍 HAProxy虽然名字前有HA,但它并不是一款高可用软件,而是一款用于实现负载均衡的软件,可实现四层与七层的负载均衡. 2.yum安装HAProxy ...

  5. 解决System.Data.SqlClient.SqlException (0x80131904): Timeout 时间已到的问题

    这段时间写Android和IOS服务时 sql数据库查询有数据正常,没数据总是报异常:System.Data.SqlClient.SqlException (0x80131904): Timeout ...

  6. .net导出excle无需任何插件,直接通过一个tablehtml实现

    项目背景: 项目需要导出样式复杂的excl表格,主要是一些样式布局比较复杂 技术分析: 目前比较通用的实现方式有 1.借助微软的excle插件 2.通过NPOI插件实现 3.直接导出一个html(ta ...

  7. C# .aspx 页面更换命名空间

    1.选中命名空间,右键单击,选择重构,之后选择重命名.如下图: 2.弹出重命名对话框 3.重写你需要的名字,点击确定. 4.这里重点注意了,不可直接点击应用,否则你会后悔的.你必须对应的看看那个是否是 ...

  8. elasticsearch6.7 05. Document APIs(9)Bulk API

    8.Bulk API 可以把多个index或delete操作放在单个bulk API中执行.这样可以极大地提高索引速度. /_bulkAPI使用如下的JSON结构: action_and_meta_d ...

  9. C++中析构函数的作用

    如果构造函数打开了一个文件,最后不需要使用时文件就要被关闭.析构函数允许类自动完成类似清理工作,不必调用其他成员函数. 析构函数也是特殊的类成员函数.简单来说,析构函数与构造函数的作用正好相反,它用来 ...

  10. C# Select