UIPageViewController的简单使用

这篇博客介绍了如何利用UIPageViewController在iOS应用中创建翻书效果。通过设置modalTransitionStyle属性,UIPageViewController可以轻松实现类似翻页的动画过渡。
摘要由CSDN通过智能技术生成


UIPageViewController为我们提供一种类似翻书的效果。

在模态推出VC的时候我们应该都设置过modalTransitionStyle属性吧?其中就有翻书的效果。而UIPageViewController所实现的主要效果就是这种翻书效果。

不废话了,直接上代码:

ViewController.m文件:


#import "ViewController.h"
#import "MoreViewController.h"


@interface ViewController ()<UIPageViewControllerDataSource>
@property (nonatomic, strong) UIPageViewController *pageVC;
@property (nonatomic, strong) NSMutableArray *muArr;//内容数组


@end

@implementation ViewController

- (void)handleData {
    NSMutableArray *tempArr = [NSMutableArray array];
    for (int i = 0; i < 10; i++) {
        NSString *str = [[NSString alloc] initWithFormat:@"这是第%d页",i];
        [tempArr addObject:str];
    }
    self.muArr = [NSMutableArray arrayWithArray:tempArr];
    
}



- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.view.backgroundColor = [UIColor whiteColor];
    
    [self setAutomaticallyAdjustsScrollViewInsets:NO];
    
    [self handleData];
    // 设置UIPageViewController的各选项
    NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithInteger:UIPageViewControllerSpineLocationMin] forKey:UIPageViewControllerOptionSpineLocationKey];
    // 实例化UIPageViewController对象
    //StyleScroll是有小点而无翻页效果;pageCurl是有翻页效果而无指示器(一排小点,<span style="font-family: Arial, Helvetica, sans-serif;">类似UIPageControl</span><span style="font-family: Arial, Helvetica, sans-serif;">);</span>
    self.pageVC = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:options];
    // 设置数据源代理
    self.pageVC.dataSource = self;
    // 定义pageVC的frame
    //[self.pageVC.view setFrame:CGRectMake(0, 20, 375, 300)];
    self.pageVC.view.frame = CGRectMake(0,0, self.view.frame.size.width, 300);
    
    // UIPageViewController对象要显示的页数据为一个NSArray。
    // 定义UIPageViewController对象显示样式为一页(options参数设置)。
    // 如果要显示2页,NSArray中需要2个相应页数据。
    MoreViewController *moreVC = [self viewControllerAtIndex:0];//第一页
    NSArray *viewArr = [NSArray arrayWithObject:moreVC];
    [self.pageVC setViewControllers:viewArr direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:^(BOOL finished) {//block内容可置nil
        
    }];
    
    [self addChildViewController:self.pageVC];
    [self.view addSubview:self.pageVC.view];
    
    
    
    
    
    
    
}

- (MoreViewController *)viewControllerAtIndex:(NSUInteger)index {//自己写的方法,返回VC对象
    if (self.muArr.count == 0 || index >= self.muArr.count) {
        return nil;
    }
    //
    MoreViewController *moreVC = [[MoreViewController alloc] init];
    moreVC.labelStr = [self.muArr objectAtIndex:index];
    moreVC.pageIndex = index;
    
    return moreVC;
}
- (NSUInteger)indexOfViewController:(MoreViewController *)viewController {//自己写的方法
    return [self.muArr indexOfObject:viewController.labelStr];
}


// 返回上一个ViewController对象,代理方法
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
    NSUInteger index = [self indexOfViewController:(MoreViewController *)viewController];
    if (index == 0 || index == NSNotFound) {
        return nil;
    }
    index--;
    
    // 返回的ViewController,将被添加到相应的UIPageViewController对象上。
    // UIPageViewController对象会根据UIPageViewControllerDataSource协议方法,自动来维护次序。
    // 不用我们去操心每个ViewController的顺序问题。
    return [self viewControllerAtIndex:index];
    
}
// 返回下一个ViewController对象,代理方法
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
    NSUInteger index = ((MoreViewController *)viewController).pageIndex;
    if (index == NSNotFound) {
        return nil;
    }
    index += 1;
    if (index == self.muArr.count) {
        return nil;
    }
    
    
    return [self viewControllerAtIndex:index];
}
//当pageVC的translationstyle设为UIPageViewControllerTransitionStylePageCurl 时,页面下方不会出现小点(类似UIPageControl);
//即如果想有翻页效果,以下的方法没用,系统不会使页面上移出现小点;
- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController {
    return self.muArr.count;
}
- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController {
    return 0;//全体小点循环右移的位数;
}






- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

MoreViewController.h文件:

#import <UIKit/UIKit.h>

@interface MoreViewController : UIViewController

@property (nonatomic, strong) UILabel *myLabel;
@property (nonatomic, copy) NSString *labelStr;

@property (nonatomic, assign) NSUInteger pageIndex;


@end



MoreViewController.m文件:


#import "MoreViewController.h"

@interface MoreViewController ()

@end

@implementation MoreViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    //self.view.backgroundColor = [UIColor whiteColor];
    self.myLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 0, 200, 30)];
    self.myLabel.backgroundColor = [UIColor orangeColor];
    self.myLabel.text = self.labelStr;
    [self.view addSubview:self.myLabel];
    
    
    
    
    
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end

大致就是这两种效果。


















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值