博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UIPageViewController
阅读量:4966 次
发布时间:2019-06-12

本文共 4350 字,大约阅读时间需要 14 分钟。

UIPageViewController是iOS5之后,苹果再度给提供的一个强大的类。用以实现类似翻页效果。

代码实现:

创建Datasource数组部分:

1 // 首先懒加载翻页控制器 2 #pragma mark - Lazy Methods 3 - (UIPageViewController *)pageVC { 4     if (!_pageVC) { 5         NSDictionary *option =\ 6         [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:UIPageViewControllerSpineLocationMin] forKey:UIPageViewControllerOptionSpineLocationKey]; 7         _pageVC =\ 8         [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:option]; 9         _pageVC.delegate = self;10         _pageVC.dataSource = self;11     }12     return _pageVC;13 }
1 // 接下来,构造数据 2 #pragma mark - View lifeCycle 3 - (void)viewDidLoad { 4     [super viewDidLoad]; 5     // 构造数据 6     [self buildData]; 7 } 8  9 // 构造数据10 - (void)buildData {11     // 构造数据12     self.dataArray = [@[@"1", @"2", @"3", @"4", @"5"] mutableCopy];13     14     [self.view addSubview:self.pageVC.view];15     [self addChildViewController:self.pageVC];16     17     HHDataController *dataVC = [self dataViewControllerAtIndex:0];18     [self.pageVC setViewControllers:@[dataVC]19                           direction:UIPageViewControllerNavigationDirectionForward20                            animated:YES21                          completion:nil];22 }

 

UIPageViewControllerDataSource 数据源方法触发条件:点击或者滑动翻页时;

1 #pragma mark - UIPageViewControllerDataSource Methods 2 /** 3  *  @brief 点击或滑动 UIPageViewController 左侧边缘时触发 4  * 5  *  @param pageViewController 翻页控制器 6  *  @param viewController     当前控制器 7  * 8  *  @return 返回前一个视图控制器 9  */10 - (nullable UIViewController *)pageViewController:(UIPageViewController *)pageViewController11                viewControllerBeforeViewController:(UIViewController *)viewController {12     // 计算当前 viewController 数据在数组中的下标13     NSUInteger index = [self.dataArray indexOfObject:((HHDataController *)viewController).imageName];14     15     // index 为 0 表示已经翻到最前页16     if (index == 0 ||17         index == NSNotFound) {18         return  nil;19     }20     21     // 下标自减22     index --;23     24     return [self dataViewControllerAtIndex:index];25 }26 27 /**28  *  @brief 点击或滑动 UIPageViewController 右侧边缘时触发29  *30  *  @param pageViewController 翻页控制器31  *  @param viewController     当前控制器32  *33  *  @return 返回下一个视图控制器34  */35 - (nullable UIViewController *)pageViewController:(UIPageViewController *)pageViewController36                 viewControllerAfterViewController:(UIViewController *)viewController {37     // 计算当前 viewController 数据在数组中的下标38     NSUInteger index = [self.dataArray indexOfObject:((HHDataController *)viewController).imageName];39     40     // index为数组最末表示已经翻至最后页41     if (index == NSNotFound ||42         index == (self.dataArray.count - 1)) {43          return nil;44     }45     46     // 下标自增47     index ++;48     49     return [self dataViewControllerAtIndex:index];50 }

 

仅仅这样,可以简单的实现翻页的效果。但是,如果快速的翻页,系统就会出现如下warning

2016-03-15 13:55:47.342 UIPageViewController示例[19649:1900548] Unbalanced calls to begin/end appearance transitions for 
.

原因:上次动画还没结束,然后又开始了新的动画。 这样就导致不能成功切换页面,而是一个白色无内容的页面。

解决方案:动画执行过程中,关闭翻页控制器视图的用户交互;动画执行完毕之后再次打开。

1 #pragma mark - UIPageViewController Methods 2 /** 3  *  @brief 转场动画即将开始 4  * 5  *  @param pageViewController     翻页控制器 6  *  @param pendingViewControllers 即将展示的控制器 7  */ 8 - (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray
*)pendingViewControllers { 9 // 转场动画未执行完,关闭用户交互10 pageViewController.view.userInteractionEnabled = NO;11 }12 13 /**14 * @brief 该方法会在 UIPageViewController 翻页效果出发之后,尚未完成时执行15 *16 * @param pageViewController 翻页控制器17 * @param finished 动画完成18 * @param previousViewControllers 前一个控制器(非当前)19 * @param completed 转场动画执行完20 */21 - (void)pageViewController:(UIPageViewController *)pageViewController22 didFinishAnimating:(BOOL)finished23 previousViewControllers:(NSArray
*)previousViewControllers24 transitionCompleted:(BOOL)completed {25 if (completed && finished) {26 // 转场动画完成,开启用户交互27 pageViewController.view.userInteractionEnabled = YES;28 }29 }

尊重作者劳动成果,转载请注明:

转载于:https://www.cnblogs.com/xiu619544553/p/5277952.html

你可能感兴趣的文章
函数的形参和实参
查看>>
文字过长 用 ... 表示 CSS实现单行、多行文本溢出显示省略号
查看>>
1Caesar加密
查看>>
【TP SRM 703 div2 500】 GCDGraph
查看>>
MapReduce 重要组件——Recordreader组件 [转]
查看>>
webdriver api
查看>>
apache 实现图标缓存客户端
查看>>
揭秘:黑客必备的Kali Linux是什么,有哪些弊端?
查看>>
linux系统的远程控制方法——学神IT教育
查看>>
springboot+mybatis报错Invalid bound statement (not found)
查看>>
Linux环境下SolrCloud集群环境搭建关键步骤
查看>>
P3565 [POI2014]HOT-Hotels
查看>>
MongoDB的简单使用
查看>>
hdfs 命令使用
查看>>
prometheus配置
查看>>
【noip2004】虫食算——剪枝DFS
查看>>
java语法之final
查看>>
python 多进程和多线程的区别
查看>>
sigar
查看>>
iOS7自定义statusbar和navigationbar的若干问题
查看>>