iOS版UIPageViewController翻页视图控制器说明

一.导言

UIPageViewController是iOS中少有的动画视图控制器之一。通过它可以创建类似UIScrollView和UIPageControl组合的滚动视图,也可以创建类似书本效果的炫酷翻页视图。

UIPageViewController最初是在iOS 5 SDK中引入的,它使开发人员能够使用这个ViewController来创建分页视图。在iOS 6中,该类已经更新为支持滚动过渡效果。使用页面视图,用户可以通过手势轻松地在多个页面之间导航。UIPage ViewController不仅仅用于引导页面,很多游戏,比如愤怒的小鸟,都是用PageView来显示关卡选择的页面,也有和书籍相关的应用,都是用这个类来显示书籍的页面。

UIPageViewController是一个高度可配置的类,您可以按如下方式配置它:

翻页方向-水平或垂直翻页样式-书籍翻页或滑动翻页书脊位置-仅书籍翻页样式对页面间距有效-仅滑动翻页样式对定义页间间距有效。

UIPageViewController类似于一个视图容器,其中每个特定的视图都由自己的ViewController维护和管理,UIPageViewController只负责协调和动画。下图可以很好的展示UIPageViewControlelr的使用结构:

上图中,UIPageViewControllerDataSource协议为UIPageViewController提供数据支持,DataSource协议提供的数据由每个ViewController维护。UIPageViewControllerDelegate中的回调可以监视翻页和屏幕旋转。UIPageViewController将从DataSource获取的视图数据呈现给View,用于当前视图控制器的显示。

为了演示,我们将一起创建一个简单的应用程序。当然,我们不会演示UIPageViewController的所有配置细节,但我们会演示使用滑动翻页样式来创建向导页面。不过不用担心,对UIPageViewController有了基本的了解,相信你也可以探索其他的特性。

开始吧!

其次,创建一个UIPageViewController。

首先,在翻页视图控制器中创建一个新类作为每个页面视图的控制器,并使其继承UIViewController:

ModelViewController.h

#导入

@ interface ModelViewController:uiview controller

+(ModelViewController *)creatWithIndex:(int)index;

@property(nonatomic,strong)ui label * index label;

@end

ModelViewController.m

#导入" ModelViewController.h "

@interface ModelViewController()

@end

@实现模型视图控制器

+(ModelViewController *)creatwinthindex:(int)index {

ModelViewController * con =[[ModelViewController alloc]init];

con . index label =[[UILabel alloc]initWithFrame:CGRectMake(110,200,100,30)];

con . index label . text =[ns string string with format:@ " page % d ",index];

[con . view addSubview:con . index label];

返回con

}

- (void)viewDidLoad {

【超级viewDidLoad】;

//在加载视图后进行任何附加设置。

self . view . background color =[ui color red color];

}

@end

在项目模板附带的ViewController.m文件中实现以下代码:

#导入" ViewController.h "

#导入" ModelViewController.h "

//遵守协议

@interface ViewController()

{

//翻页视图控制器对象

UIPageViewController * _ pageview control;

//数据源数组

NSMutableArray * _ dataArray

}

@end

@实现视图控制器

- (void)viewDidLoad {

【超级viewDidLoad】;

//初始化

_ pageViewControl =[[UIPageViewController alloc]initwithfransitionstyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:uipageviewcontrollerorientionhorizontal options:@ { U ipageviewcontrolleroptions spinelocationkey:@ 0,uipageviewcontrolleroptions interpagespacingkey:@ 10 }];

self . view . background color =[ui color green color];

//设置翻页视图的大小。

_ pageview control . view . bounds = self . view . bounds;

//设置数据源和代理

_ pageview control . data source = self;

_ pageview control . delegate = self;

//创建初始接口

ModelViewController * model =[ModelViewController creatWithIndex:1];

//设置初始界面

[_ pageview control setview controllers:@[model]direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:nil];

//设置是否双面显示。

_ pageview control . doublesided = NO;

_ data array =[[NSMutableArray alloc]init];

[_ data array add object:model];

[self . view add subview:_ pageview control . view];

}

//翻页控制器向前翻页。此数据源方法返回的视图控制器是显示视图的视图控制器。

-(可为null的UIViewController *)pageview controller:(UIPageViewController *)pageview controller viewController beforeviewcontroller:(uiview controller *)view controller {

int index =(int)[_ data array index of object:view controller];

if (index==0) {

返回nil

}否则{

return _ data array[index-1];

}

}

//翻页控制器执行向后翻页动作。此数据源方法返回的视图控制器是显示视图的视图控制器。

-(可为null的UIViewController *)pageview controller:(UIPageViewController *)pageview controller viewControllerAfterViewController:(uiview controller *)view controller {

int index =(int)[_ data array index of object:view controller];

if (index==9) {

返回nil

}否则{

if(_ data array . count-1 & gt;=(index+1)) {

return _ data array[index+1];

}否则{

ModelViewController * model =[ModelViewController creatWithIndex:index+2];

[_ data array add object:model];

退货模式;

}

}

}

//屏幕旋转触发的代理方法

-(UIPageViewControllerSpineLocation)pageview controller:(UIPageViewController *)pageview controller spinelocationforinterface orientation:(uiinterface orientation)orientation {

返回UIPageViewControllerSpineLocationMin;

}

//设置寻呼控制器的寻呼号。

-(NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageview controller {

返回10;

}

//设置初始分页点

-(NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageview controller {

返回0;

}

@end

上面创建了翻页视图控制器最简单的例子,效果如下:

第三,UIPageViewController中方法用法的分析

//创建翻页视图控制器对象

-(instance type)initwithhtransitionstyle:(UIPageViewControllerTransitionStyle)style navigation orientation:(UIPageViewControllerNavigationOrientation)navigation orientation options:(可为null的ns dictionary *)options;

上述方法用于创建视图控制器对象,其中UIPageViewControllerTransitionStyle参数设置翻页控制器的样式,枚举如下:

typedef NS_ENUM(NSInteger,UIPageViewControllerTransitionStyle){

UipageviewControllerTransitionstylePagecurl = 0,//类似于书籍翻页的效果。

UipageviewControllerTransitionStyleScroll = 1//类似于ScrollView的滑动效果。

};

如果设置为UIPageView ControllerTransitionStyleCurl,翻页效果如下图所示:

上面初始化方法中的UIPageViewControllerNavigationOrientation属性设置翻页的方向,枚举如下:

typedef NS_ENUM(NSInteger,UIPageViewControllerNavigationOrientation){

UipageviewControllerNavigationOrientationHorizontal = 0,//水平翻页。

UipageviewControllerNavigationOrientationVertical = 1//垂直翻页。

};

options参数用于设置翻页查看控制器的配置字典,可以设置的配置键值如下:

//这个键需要设置为uipageviewcontrolleroptions spinelocationkey枚举值对应的` NSNumber对象,翻页控制器的书轴稍后设置。

ns string * const uipageviewcontrolleroptions spinelocationkey;

//该键需要设置为NSNumber类型,为滚动视图样式设置每个页面视图的间距。

ns string * const UIPageViewControllerOptionInterPageSpacingKey;

以下是UIPageViewController的一些常见属性和方法:

//设置数据源

@property(可空、非原子、弱)iddelegate。

//设置代理

@property(可空、非原子、弱)iddataSource。

//获取翻页样式

@property (nonatomic,readonly)UIPageViewControllerTransitionStyle transitionStyle;

//获取翻页方向

@property (nonatomic,readonly)UIPageViewControllerNavigationOrientation navigation orientation;

//获取滚动类型

@property (nonatomic,readonly)UIPageViewControllerSpineLocation spine location;

//设置是否双面显示。

@property (nonatomic,getter = is doubleSided)BOOL doubleSided;

//设置要显示的视图控制器。

-(void)setviewcontrollers:(nullable nsarray *)view controllers direction:(uipageviewcontrollernavigationdirection)direction animated:(bool)animated completion:(void(^ _ _ nullable)(bool finished))completion;

只有上面的spineLocation属性有些难以理解,其枚举如下:

typedef NS_ENUM(NSInteger,UIPageViewControllerSpineLocation){

//对于SCrollView类型滑动效果,不滚动将返回以下枚举值。

UIPageViewControllerSpineLocationNone = 0,

//向左或向上旋转界面,同一时间只显示一个视图。

UIPageViewControllerSpineLocationMin = 1,

//以中间为轴翻转界面,可以同时显示两个视图。

UIPageViewControllerSpineLocationMid = 2,

//以下边缘或右边缘为轴翻转界面,同时只显示一个视图。

UIPageViewControllerSpineLocationMax = 3

};

将上面的示例代码修改如下:

- (void)viewDidLoad {

【超级viewDidLoad】;

//在加载视图之后进行任何额外的设置,通常是从nib。

_ pageViewControl =[[UIPageViewController alloc]initwithfransitionstyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:uipageviewcontrolleroptionspinelocationkey:@ { U ipageviewcontrolleroptions:@ 2,UIPageViewControllerOptionInterPageSpacingKey:@ 10 }];

self . view . background color =[ui color green color];

_ pageview control . view . bounds = self . view . bounds;

_ pageview control . data source = self;

_ pageview control . delegate = self;

ModelViewController * model =[ModelViewController creatWithIndex:1];

ModelViewController * model 2 =[ModelViewController creatWithIndex:2];

[_ pageViewControl setview controllers:@[model,model 2]direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:nil];

_ pageview control . doublesided = YES;

_ data array =[[NSMutableArray alloc]init];

[_ data array add object:model];

[self . view add subview:_ pageview control . view];

}

-(UIPageViewControllerSpineLocation)pageview controller:(UIPageViewController *)pageview controller spinelocationforinterface orientation:(uiinterface orientation)orientation {

返回UIPageViewControllerSpineLocationMid;

}

操作效果如下图所示:

第四,UIPageViewControllerDataSource中的方法分析

//向前翻页以显示ViewController。

-(可空UIViewController *)pageview controller:(UIPageViewController *)pageview controller viewController beforeviewcontroller:(UIViewController *)view controller;

//返回页面以显示ViewController。

-(可空UIViewController *)pageview controller:(UIPageViewController *)pageview controller viewControllerAfterViewController:(UIViewController *)view controller;

//设置寻呼控制器的寻呼号。

-(NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController NS _ AVAILABLE _ IOS(6 _ 0);

//设置当前分页控制器的高亮点。

-(NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController NS _ AVAILABLE _ IOS(6 _ 0);

第五,UIPageViewControllerDelegate中的方法分析

//翻页视图控制器即将翻页时要执行的方法。

-(void)pageview controller:(UIPageViewController *)pageview controller willTransitionToViewControllers:(NSArray *)pendingViewControllers NS _ AVAILABLE _ IOS(6 _ 0);

//翻页动画完成后回调方法。

-(void)pageViewController:(UIPageViewController *)pageViewController did finish hanimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transition completed:(BOOL)completed;

//对于屏幕防线改变时要返回的方法,可以通过返回值重置书轴类型枚举。

-(UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController spinelocationforinterfaceoption:(uiinterfaceotination)orientation;