版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014799068/article/details/81280215
1. UIPageViewController的作用?
UIPageViewController为容器视图控制器可以添加多个子视图控制器.一般多用于单个视图控制器多个标签页切换使用.
2. 初始化方法
- (instancetype)initWithTransitionStyle:(UIPageViewControllerTransitionStyle)style
navigationOrientation:(UIPageViewControllerNavigationOrientation)navigationOrientation
options:(NSDictionary<UIPageViewControllerOptionsKey, id> *)options;
//style:翻页模式包含两种
1. UIPageViewControllerTransitionStylePageCurl 卷页过渡模式
2. UIPageViewControllerTransitionStyleScroll 滚动过渡模式
//navigationOrientation: 翻页方向
1. UIPageViewControllerNavigationOrientationHorizontal 水平方向 左右
2. UIPageViewControllerNavigationOrientationVertical 垂直方向 上下
//options 选项字典 UIPageViewControllerOptionsKey包含两种选项:
1. UIPageViewControllerOptionInterPageSpacingKey 页面之间的间距***只对滚动过渡模式有效UIPageViewControllerTransitionStyleScroll*** CGFloat类型
2. UIPageViewControllerOptionSpineLocationKey 脊柱位置 ***只对卷页过渡效果有效UIPageViewControllerTransitionStylePageCurl***
3. 提供视图控制器的方式有哪两种?
*编程方式提供:
- (void)setViewControllers:(NSArray<UIViewController *> *)viewControllers
direction:(UIPageViewControllerNavigationDirection)direction
animated:(BOOL)animated
completion:(void (^)(BOOL finished))completion;
//参数viewControllers:
为提供的一个或两个视图控制器,取决于UIPageViewControllerOptionSpineLocationKey的值当locationKey为UIPageViewControllerSpineLocationMid时viewControllers为两个视图控制器,其他情况为单个控制器.
//direction:方向根据初始化时navigationOrientation的方向进行改变
UIPageViewControllerNavigationDirectionForward 正向
UIPageViewControllerNavigationDirectionReverse 反向
*数据源提供控制器:UIPageViewControllerDataSource
#pragma mark UIPageViewControllerDataSource
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController{
NSLog(@"后一个视图控制器");
NSInteger after = currentIndex + 1;
if (after >= vcs.count) {
return nil;
}
return vcs[after];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
NSLog(@"前一个视图控制器");
NSInteger before = currentIndex - 1;
if (before < 0) {
return nil;
}
return vcs[before];
}
4.通过实例来展示UIPageViewController如何使用
(以下代码只是用来测试UIPageViewController示例所用)
#import "ViewController.h"
#import "AViewController.h"
#import "BViewController.h"
#import "CViewController.h"
@interface ViewController ()<UIPageViewControllerDelegate, UIPageViewControllerDataSource>
{
AViewController *aVc;
BViewController *bVc;
CViewController *cVc;
NSArray *vcs;
NSInteger currentIndex;
UIViewController *pendvc;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIPageViewController *pageVc = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:@{UIPageViewControllerOptionSpineLocationKey:@(UIPageViewControllerSpineLocationMid),
UIPageViewControllerOptionInterPageSpacingKey:@(15.0)}]; //pageCurl卷页效果
aVc = [AViewController new];
bVc = [BViewController new];
cVc = [CViewController new];
pageVc.delegate = self;
pageVc.dataSource = self;
vcs = @[aVc,bVc,cVc,aVc,bVc,cVc];
[pageVc setViewControllers:@[aVc,bVc] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];
pageVc.view.frame = self.view.bounds;
[self addChildViewController:pageVc];
[self.view addSubview:pageVc.view];
}
#pragma mark UIPageViewControllerDataSource
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController{
NSLog(@"后一个视图控制器");
NSInteger after = currentIndex + 1;
if (after >= vcs.count) {
return nil;
}
return vcs[after];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
NSLog(@"前一个视图控制器");
NSInteger before = currentIndex - 1;
if (before < 0) {
return nil;
}
return vcs[before];
}
#pragma mark UIPageViewControllerDelegate
- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray<UIViewController *> *)pendingViewControllers{
NSLog(@"动画过渡开始之前");
pendvc = pendingViewControllers.firstObject;
}
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray<UIViewController *> *)previousViewControllers transitionCompleted:(BOOL)completed{
NSLog(@"动画过渡完成previousViewControllers"); //previousViewControllers为过渡之前的视图控制器
[vcs enumerateObjectsUsingBlock:^(UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj == pendvc) { //判断视图控制器是否与正在转换的视图控制器为同一个
currentIndex = idx;
*stop = YES;
}
}];
}
***以下两个delegate方式在卷页过渡效果时设置UIPageViewControllerTransitionStylePageCurl***
//返回视图控制器支持的所有方向
- (UIInterfaceOrientationMask)pageViewControllerSupportedInterfaceOrientations:(UIPageViewController *)pageViewController {
return UIInterfaceOrientationMaskLandscape;
}
//返回视图控制器的首选方向
- (UIInterfaceOrientation)pageViewControllerPreferredInterfaceOrientationForPresentation:(UIPageViewController *)pageViewController {
return UIInterfaceOrientationLandscapeRight;
}
@end
5.禁用UIPageViewController滑动
1.直接不设置数据源dataSource即可或dataSource = nil
2.从网上看的思路就是找到UIScrollView并将UIPageViewController中的scrollEnabled = NO;
//获取UIScrollView
- (UIScrollView *)findScrollView:(NSArray<UIView *>*)suviews {
__block UIScrollView *scrollView = nil;
[suviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isKindOfClass:[UIScrollView class]]) {
scrollView = obj;
*stop = YES;
}
}];
return scrollView;
}
以上两种方法都可以禁用滑动,但第二种方法没啥必要,因为只用滑动的时候设置数据源dataSource才是有效的,不滑动的话直接用
- (void)setViewControllers:(NSArray<UIViewController *> *)viewControllers
direction:(UIPageViewControllerNavigationDirection)direction
animated:(BOOL)animated
completion:(void (^)(BOOL finished))completion;
即可.
* 如有错误的地方还望指正,感谢!!!*