iOS 浅谈UIPageViewController的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;

即可.

* 如有错误的地方还望指正,感谢!!!*

猜你喜欢

转载自blog.csdn.net/u014799068/article/details/81280215
今日推荐