這個效果我找了好幾天,什麼openGL,Layer,pageCurl效果都看過了,其中code4app,github上有許多類似的效果,都感覺不錯,始終覺得UIPageViewController原生的類應該會有類似的解決辦法,不容易啊!
好吧,廢話不多說,直接上代碼
//
// ViewController.m
// UIPageVIewControllerDemo
//
// Created by HaiBing on 15/7/26.
// Copyright (c) 2015年 Nfschina. All rights reserved.
//
#import "ViewController.h"
#import "ContentViewController.h"
@interface ViewController ()<UIPageViewControllerDataSource,UIPageViewControllerDelegate>
@property (nonatomic,strong)UIPageViewController *pageController;
@property (nonatomic,strong)NSArray *pageContent;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self createContentPages];
// UIPageViewControllerSpineLocationMid這個參數設置書脊的位置,這裏設置在中間
NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:UIPageViewControllerSpineLocationMid] forKey:UIPageViewControllerOptionSpineLocationKey];
self.pageController = [[UIPageViewController alloc]initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:options];
self.pageController.dataSource = self;
CGRect rect = self.view.bounds;
// rect.size.width /= 2;
// rect.origin.x = rect.size.width;
[self.pageController.view setFrame:rect];
//既然書脊在中間,那肯定有兩頁,默認第一頁和第二頁
ContentViewController *firstViewController = [self viewControllerAtIndex:0];
ContentViewController *secondViewController = [self viewControllerAtIndex:1];
NSArray *viewControllers = [NSArray arrayWithObjects:firstViewController,secondViewController, nil];
[self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];
[self addChildViewController:self.pageController];
[self.view addSubview:self.pageController.view];
}
- (ContentViewController *)viewControllerAtIndex:(NSInteger)index
{
if (self.pageContent.count == 0 || index >= self.pageContent.count) {
return nil;
}
ContentViewController *dataViewController = [[ContentViewController alloc]init];
dataViewController.dataObject = [self.pageContent objectAtIndex:index];
return dataViewController;
}
- (NSInteger)indexOfViewController:(MoreViewController *)viewController
{
return [self.pageContent indexOfObject:viewController.dataObject];
}
//初始化數據,像tableView一樣
- (void)createContentPages
{
NSMutableArray *pagesStrings = [[NSMutableArray alloc]init];
for (int i = 0; i < 10; i++) {
NSString *contentString = [NSString stringWithFormat:@"00%d.jpg",i];
[pagesStrings addObject:contentString];
}
self.pageContent = [pagesStrings copy];
}
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
if (completed) {
ContentViewController *previousViewController = (ContentViewController*)previousViewControllers.lastObject;
previousViewController.view.hidden = true;
}
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
NSInteger index = [self indexOfViewController:(ContentViewController *)viewController];
if (index == 0 || index == NSNotFound) {
return nil;
}
index--;
return [self viewControllerAtIndex:index];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
NSInteger index = [self indexOfViewController:(ContentViewController *)viewController];
if (index == NSNotFound) {
return nil;
}
index++;
if (index == self.pageContent.count) {
return nil;
}
return [self viewControllerAtIndex:index];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
然後再ContentViewController中
@interface ContentViewController : UIViewController
@property (nonatomic,strong)id dataObject;
@end
// ContentVIewCOntroller.m
// UIPageVIewControllerDemo
//
// Created by HaiBing on 15/7/26.
// Copyright (c) 2015年 Nfschina. All rights reserved.
//
#import "<span style="font-family: Arial, Helvetica, sans-serif;">ContentVIewCOntroller</span>.h"
@interface MoreViewController ()
@end
@implementation <span style="font-family: Arial, Helvetica, sans-serif;">ContentVIewCOntroller</span>
- (void)viewDidLoad {
[super viewDidLoad];
NSString *imageName = (NSString *)_dataObject;
CGRect rect = self.view.bounds;
rect.size.width /= 2;
UIImageView *imageView = [[UIImageView alloc]initWithFrame:rect];
imageView.image = [UIImage imageNamed:imageName];
[self.view addSubview:imageView];
}
- (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
實現書本那樣翻頁的效果就這麼簡單,想要實現單頁的就只需把UIPageViewControllerSpineLocationMid改成UIPageViewControllerSpineLocationMin,然後把NSArray *viewControllers = [NSArray arrayWithObjects:firstViewController, nil];改成這樣即可。是不是比code4app上德哪些簡單。
好了,運行一下,測一測吧。