您的位置:首页 > 产品设计 > UI/UE

UIPageViewController的简单使用

2015-11-27 22:54 513 查看
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


大致就是这两种效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: