一、前言

这些天有新生问及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. C++学习总结(2)

    1.const指针 指向常量的指针变量,其一般形式为 "const 类型名 * 指针变量名 " . 如下: int a=12,b=15; const int *p=&a; ...

  2. redis 五种数据类型

    前言 前面学会了单机, 学会了集群, 但是redis咋用啊? 或者说, redis支持哪些数据类型呢? 常用的有五种: String , Hash, List, Set, zset(SortedSet ...

  3. leetcode — longest-substring-without-repeating-characters

    import java.util.HashSet; import java.util.Set; /** * Source : https://oj.leetcode.com/problems/long ...

  4. 自己动手实现java数据结构(六)二叉搜索树

    1.二叉搜索树介绍 前面我们已经介绍过了向量和链表.有序向量可以以二分查找的方式高效的查找特定元素,而缺点是插入删除的效率较低(需要整体移动内部元素):链表的优点在于插入,删除元素时效率较高,但由于不 ...

  5. ProxySQL+MGR实现读写分离和主节点故障无感知切换 - 完整操作记录

    前面的文章介绍了ProxySQL用法,这里说下ProxySQL中间件针对Mysql组复制模式实现读写分离以及主节点故障时能够自动切换到新的主节点,而应用对此过程无感知的功能.Mysql组复制(MGR) ...

  6. vue router history模式开发ngnix配置

    一.前沿 现在很多用vue-router开发页面的时候,都习惯使用hash路由莫模式,如:https://xxxx/#/index/share?code=dsfsd.这种模式在做pc端开发时候挺好用的 ...

  7. Redis缓存使用技巧

    缓存能够有效加速应用的访问速度,同时可以降低后端负载,在应用架构中起着至关重要的作用,本文主要介绍缓存使用的一些技巧. 缓存更新策略 LRU/LFU/FIFO算法剔除 场景:数据一致性要求较低 原理: ...

  8. 如何利用Maven Repository下载开源软件jar包

    1.打开Maven Repository 网站:https://mvnrepository.com/ 2.输入需要寻找的jar包名称,比如mybatis,点击search,一般第一个就是 3.点击选择 ...

  9. Chart控件,chart、Series、ChartArea曲线图绘制的重要属性介绍

    先简单说一下,从图中可以看到一个chart可以绘制多个ChartArea,每个ChartArea都可以绘制多条Series.ChartArea就是就是绘图区域,可以有多个ChartArea叠加在一起, ...

  10. laravel使用JSON 类型方式进行存储

    Laravel 从 5.0 版本开始就已支持 JSON 数据的转换,但这样做的目的只是为了方便数据处理.你的数据依然以 TEXT 类型存放在你的数据库里.不过 MySQL 从 5.7 版本起开始支持原 ...