在地鐵上看到看小說的翻頁效果,研究了一下,發現蘋果自帶翻頁神器UIPageViewController
UIPageViewController一些常用的屬性:
- 首頁展示的頁面的個數
typedef NS_ENUM(NSInteger, UIPageViewControllerSpineLocation) {
UIPageViewControllerSpineLocationNone = 0, // Returned if 'spineLocation' is queried when 'transitionStyle' is not 'UIPageViewControllerTransitionStylePageCurl'.
UIPageViewControllerSpineLocationMin = 1, // Requires one view controller.
UIPageViewControllerSpineLocationMid = 2, // Requires two view controllers.
UIPageViewControllerSpineLocationMax = 3 // Requires one view controller.
}; // Only pertains to 'UIPageViewControllerTransitionStylePageCurl'.
- 翻頁方式
typedef NS_ENUM(NSInteger, UIPageViewControllerNavigationDirection) {
UIPageViewControllerNavigationDirectionForward, //從左往右(或從下往上)翻頁
UIPageViewControllerNavigationDirectionReverse //從右往左(或從上往下)翻頁
};
- 翻轉的樣式
typedef NS_ENUM(NSInteger, UIPageViewControllerTransitionStyle) {
UIPageViewControllerTransitionStylePageCurl = 0, //翻書效果樣式
UIPageViewControllerTransitionStyleScroll = 1 //類似Scrollview的滑動效果
};
- 上下或者左右翻頁的枚舉
typedef NS_ENUM(NSInteger, UIPageViewControllerNavigationOrientation) {
UIPageViewControllerNavigationOrientationHorizontal = 0, //水平
UIPageViewControllerNavigationOrientationVertical = 1 //垂直
};
常用的用法
- 遵循page協議
@interface ViewController : UIViewController<UIPageViewControllerDelegate,UIPageViewControllerDataSource>
@end
- 初始化pageController
NSDictionary *options =[NSDictionary dictionaryWithObject:[NSNumber numberWithInteger:UIPageViewControllerSpineLocationMin] forKey: UIPageViewControllerOptionSpineLocationKey];
_pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:options];
_pageViewController.delegate = self;
_pageViewController.dataSource = self;
_pageViewController.doubleSided = NO;
[self addChildViewController:_pageViewController];
[self.view addSubview:_pageViewController.view];
UIViewController *vc = [self createViewController:0];
//首頁的效果
[_pageViewController setViewControllers:@[vc]
direction:UIPageViewControllerNavigationDirectionReverse
animated:YES
completion:nil];
[self.datas addObject:vc];
for (int i = 0; i < 10; i++) {
[self.datas addObject:[self createViewController:i]];
- 翻到下一頁
//下一頁
- (nullable UIViewController *) pageViewController:(nonnull UIPageViewController *)pageViewController viewControllerAfterViewController:(nonnull UIViewController *)viewController {
NSInteger index = [self.datas indexOfObject:viewController];
index ++;
if (index == self.datas.count ) {
return nil;
}
return [self.datas objectAtIndex:index];
}
- 上一頁
-(nullable UIViewController *) pageViewController:(nonnull UIPageViewController *)pageViewController viewControllerBeforeViewController:(nonnull UIViewController *)viewController {
NSInteger index = [self.datas indexOfObject:viewController];
index --;
if (index < 0) {
return nil;
}
return [self.datas objectAtIndex:index];
}
- 返回頁控制器中頁的數量
-(NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
{
return self.datas.count;
}
//返回頁控制器中當前頁的索引
-(NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
{
return 0;
}
- 屏幕旋轉代理方法,旋轉方式
- (UIPageViewControllerSpineLocation) pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation{
return UIPageViewControllerSpineLocationMin;
}
- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray<UIViewController *> *)pendingViewControllers
{
NSLog(@"將要翻頁也就是手勢觸發時調用方法");
}