####iOS7 Programming Cookbook 第一章学习笔记 UIProgressView
#####Enabling Paging with UIPageViewController
#####RootViewController.h1
2
3
4
5@interface RootViewController : UIViewController <UIPageViewControllerDelegate>
//声明 pageViewController
@property (strong, nonatomic) UIPageViewController *pageViewController;
@end
#####RootViewController.m1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94@interface RootViewController ()
//私有
@property (readonly, strong, nonatomic) ModelController *modelController;
@end
@implementation RootViewController
@synthesize modelController = _modelController;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// Configure the page view controller and add it as a child view controller.
//UIPageViewControllerTransitionStylePageCurl 过渡动画
//UIPageViewControllerNavigationOrientationHorizontal 水平方向页面向左和右边
self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
//delegate
self.pageViewController.delegate = self;
//初始化data为0
DataViewController *startingViewController = [self.modelController viewControllerAtIndex:0 storyboard:self.storyboard];
//添加到viewContro数组
NSArray *viewControllers = @[startingViewController];
//UIPageViewControllerNavigationDirectionForward :导航到下一页
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL];
//dataSource
self.pageViewController.dataSource = self.modelController;
//给定该视图控制器的子视图为 pageViewController
// [child willMoveToParentViewController:self] before
[self addChildViewController:self.pageViewController];
//view添加到self.view
[self.view addSubview:self.pageViewController.view];
//设置pageview bounds插入一个矩形,可见边缘的page
CGRect pageViewRect = self.view.bounds;
//iPad
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
pageViewRect = CGRectInset(pageViewRect, 40.0, 40.0);
}
self.pageViewController.view.frame = pageViewRect;
//如果正在使用当前视图,必须调用didMoveToParentViewController:子视图控制器的方法过渡到新的控制器完成后,如果没有过渡,接着调用addChildViewController:方法。
[self.pageViewController didMoveToParentViewController:self];
// Add the page view controller's gesture recognizers to the book view controller's view so that the gestures are started more easily.\
self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (ModelController *)modelController
{
//返回modelController对象,必须创建
//复杂操作,modelview可以传递到viewcontroller
if (!_modelController) {
_modelController = [[ModelController alloc] init];
}
return _modelController;
}
//delegate可以设置新视图控制器或更新双面状态在这个方法的实现。
- (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation
{
//竖着 || iPhone
if (UIInterfaceOrientationIsPortrait(orientation) || ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)) {
// In portrait orientation or on iPhone: Set the spine position to "min" and the page view controller's view controllers array to contain just one view controller. Setting the spine position to 'UIPageViewControllerSpineLocationMid' in landscape orientation sets the doubleSided property to YES, so set it to NO here.
UIViewController *currentViewController = self.pageViewController.viewControllers[0];
NSArray *viewControllers = @[currentViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL];
self.pageViewController.doubleSided = NO;
return UIPageViewControllerSpineLocationMin;
}
return UIPageViewControllerSpineLocationMid;
}
@end
#####DataViewController.h1
2
3
4
5
6@interface DataViewController : UIViewController
@property (strong, nonatomic) IBOutlet UILabel *dataLabel;
@property (strong, nonatomic) id dataObject;
@end
#####DataViewController.m1
2
3
4
5
6
7//view显示前方法
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
//设置dataLabel.text值为dataObject详细描述
self.dataLabel.text = [self.dataObject description];
}
#####ModelController.h1
2
3
4
5
6
7
8
9@class DataViewController;
@interface ModelController : NSObject <UIPageViewControllerDataSource>//pageViewController数据源协议
//返回DataViewController 传入view的参数,和storyboard
- (DataViewController *)viewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard;
//返回数字,传入DataViewController
- (NSUInteger)indexOfViewController:(DataViewController *)viewController;
@end
#####ModelController.m1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82@interface ModelController()
@property (readonly, strong, nonatomic) NSArray *pageData;
@end
@implementation ModelController
- (id)init
{
self = [super init];
if (self) {
//创建日期格式化
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
//返回月份符号到数组
_pageData = [[dateFormatter monthSymbols] copy];
}
return self;
}
- (DataViewController *)viewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard
{
// Return the data view controller for the given index.
//如果数组 = 0,或者当前数字 》= 数组个数和,返回nil
if (([self.pageData count] == 0) || (index >= [self.pageData count])) {
return nil;
}
//从storyboard创建一个新的viewcontroller
DataViewController *dataViewController = [storyboard instantiateViewControllerWithIdentifier:@"DataViewController"];
//id对象 = pageData数组的当前内容
dataViewController.dataObject = self.pageData[index];
//返回Controller
return dataViewController;
}
- (NSUInteger)indexOfViewController:(DataViewController *)viewController
{
// Return the index of the given data view controller.
// For simplicity, this implementation uses a static array of model objects and the view controller stores the model object; you can therefore use the model object to identify the index.
//返回index
//举例,这实现了用一个静态数组从模型对象和视图控制器储备对象;你因此可以用模型对象去鉴定index
//当前DataView 在pageData数组中的index
return [self.pageData indexOfObject:viewController.dataObject];
}
//前一个视图
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
//当前index
NSUInteger index = [self indexOfViewController:(DataViewController *)viewController];
if ((index == 0) || (index == NSNotFound)) {
//返回空
return nil;
}
index--;
return [self viewControllerAtIndex:index storyboard:viewController.storyboard];
}
//后一个视图
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
//当前index
NSUInteger index = [self indexOfViewController:(DataViewController *)viewController];
if (index == NSNotFound) {
return nil;
}
//+1
index++;
//如果等于总数,返回nil,最后一页
if (index == [self.pageData count]) {
return nil;
}
//展示DataViewController
return [self viewControllerAtIndex:index storyboard:viewController.storyboard];
}
@end