UIPageViewController
Posted wycstudy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UIPageViewController相关的知识,希望对你有一定的参考价值。
先说初始化
- (UIPageViewController *)PageViewController{ if(!_PageViewController){ //书脊位置,只有在UIPageViewControllerTransitionStylePageCurl才生效 NSDictionary *options =[NSDictionary dictionaryWithObject:[NSNumber numberWithInteger:UIPageViewControllerSpineLocationMin] forKey: UIPageViewControllerOptionSpineLocationKey]; //两个page之间的间距,只有UIPageViewControllerTransitionStyleScroll格式才生效 // NSDictionary *options =[NSDictionary dictionaryWithObject:[NSNumber numberWithInteger:0] // forKey: UIPageViewControllerOptionInterPageSpacingKey]; _PageViewController = [[ UIPageViewController alloc]initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:options]; _PageViewController.view.backgroundColor = [UIColor clearColor]; _PageViewController.dataSource = self; _PageViewController.delegate = self; } return _PageViewController; }
然后填充内容
//填充PageView - (void)setPageViewData{ [self.controllerArray removeAllObjects]; ReadingSubViewController *subView = [self viewControllerAtIndex:0]; [self.controllerArray addObject:subView]; [self.PageViewController setViewControllers:self.controllerArray direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:^(BOOL finished) { }]; } - (ReadingSubViewController *)viewControllerAtIndex:(NSInteger)index{ NSLog(@"push%ld",index); ReadingSubViewController *subView = [[ReadingSubViewController alloc]init]; subView.pageModel = self.bookpageData[index]; subView.bookModel = self.model; subView.pageIndex = index; _open = YES; [self pushButtonClick]; return subView; }
&&重点
重点是是他内部的运行逻辑,我也是今天才搞清楚。
先看delegate
#pragma mark ==========PageVCDelegate========== //这个方法是返回前一个页面,如果返回为nil,那么UIPageViewController就会认为当前页面是第一个页面不可以向前滚动或翻页 - (nullable UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController{ NSInteger index = [self getIndex:(ReadingSubViewController *)viewController]; NSLog(@"before=%ld",index); if (index == 0 || index == NSNotFound) { return nil; } index -- ; ReadingSubViewController *playVC = [self viewControllerAtIndex:index]; if (index+1< 10) { self.pageNumberLB.text = [NSString stringWithFormat:@"0%ld/%ld",index+1,_maxPage]; }else{ self.pageNumberLB.text = [NSString stringWithFormat:@"%ld/%ld",index+1,_maxPage]; } return playVC; } //这个方法是下一个页面,如果返回为nil,那么UIPageViewController就会认为当前页面是最后一个页面不可以向后滚动或翻页 - (nullable UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController{ NSInteger index = [self getIndex:(ReadingSubViewController *)viewController]; if (index == NSNotFound || index == _maxPage - 1) { return nil; } NSLog(@"after=%ld",index); index ++; ReadingSubViewController *playVC = [self viewControllerAtIndex:index]; if (index+1< 10) { self.pageNumberLB.text = [NSString stringWithFormat:@"0%ld/%ld",index+1,_maxPage]; }else{ self.pageNumberLB.text = [NSString stringWithFormat:@"%ld/%ld",index+1,_maxPage]; } return playVC; } - (NSInteger)getIndex:(ReadingSubViewController *)subVC{ return subVC.pageIndex; }
如果TransitionStyle是UIPageViewControllerTransitionStylePageCurl
那么从首页开始拖动的时候,往左拖动,会触发viewControllerBeforeViewController这个代理方法,并不会触发viewControllerAfterViewController代理方法。
然后每次往右拖动时只会加载一个ViewController。上面整个流程的Log如下
eadingViewController.m[88] push0 ReadingViewController.m[102] before=0 ReadingViewController.m[121] after=0 ReadingViewController.m[88] push1 ReadingViewController.m[136] 开始滚动 ReadingViewController.m[140] isCompleted:成功 ReadingViewController.m[121] after=1 ReadingViewController.m[88] push2 ReadingViewController.m[136] 开始滚动 ReadingViewController.m[140] isCompleted:成功
如果TransitionStyle是UIPageViewControllerTransitionStyleScroll
那么从首页开始拖动,不管是往右还是往左,都肯定会viewControllerAfterViewController,为PageController加载好下个Page的ViewController。我往左拖动的Log如下
ReadingViewController.m[88] push0 ReadingViewController.m[102] before=0 ReadingViewController.m[121] after=0 ReadingViewController.m[88] push1
虽然拖动完成的代理方法没有执行。但是 viewControllerAfterViewController方法触发,加载好了下一页的ViewController内容。
然后往右拖动会提前加载第三页的内容Log如下
ReadingViewController.m[102] before=0 ReadingViewController.m[121] after=0 ReadingViewController.m[88] push1 ReadingViewController.m[136] 开始滚动 ReadingViewController.m[140] isCompleted:成功 ReadingViewController.m[121] after=1 ReadingViewController.m[88] push2
如果是开始就往右拖动的话Log如下
ReadingViewController.m[88] push0 ReadingViewController.m[121] after=0 ReadingViewController.m[88] push1 ReadingViewController.m[102] before=0 ReadingViewController.m[136] 开始滚动 ReadingViewController.m[140] isCompleted:成功 ReadingViewController.m[121] after=1 ReadingViewController.m[88] push2 ReadingViewController.m[136] 开始滚动 ReadingViewController.m[140] isCompleted:成功 ReadingViewController.m[121] after=2 ReadingViewController.m[88] push3
这是拖动到第三页的时候,但是第四页其实已经预加载好了。
之前一直没有用过UIPageViewControllerTransitionStyleScroll,今天用了一次才发现自己认识的很不清晰。做下记录
以上是关于UIPageViewController的主要内容,如果未能解决你的问题,请参考以下文章
如何用 UIScrollView 实现 UIPageViewController?
UIPageViewController 中的 UIScrollView 滚动了多少?
UIpageviewcontroller 内的 UIScrollview