向后或向前滑动时检查UIPageViewController

我想使用UIPageViewController跟踪索引。 每当我刷卡时,我需要index++index-- 。 无论何时向后或向后滑动,都会调用此委托方法:

 - (void)pageViewController:(UIPageViewController *)pvc didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed { // If the page did not turn if (!completed) { // You do nothing because whatever page you thought // the book was on before the gesture started is still the correct page return; } // I want to check here whenever the page was swiped back or further } 

如果用户向后或向后滑动,如何检查此方法? 我知道有2个DataSource方法“viewControllerAfterViewController”和“viewControllerBeforeViewController”,但我无法检查页面转换是否已完成(我可以在上面的方法中执行此操作)任何想法如何我可以知道用户是否向后滑动或进一步以上方法?

根据文档 ,似乎没有办法判断用户是向前还是向后滑动页面。 布尔“完成”将告诉您用户是否已完成翻页。

解决方法:

创建一个int变量并使用viewControllerAfterViewController和viewControllerBeforeViewController方法增加或减少变量的值。 用它来测试它们是向前还是向后移动。

编辑:您可以从文档中使用presentationIndexForPageViewController

编辑2: 在这里检查此链接有一个名为setViewControllers:direction:animated:completion:的方法setViewControllers:direction:animated:completion:方向将是UIPageViewControllerNavigationDirectionForwardUIPageViewControllerNavigationDirectionReverse

编辑3:代码 – 假设您知道将向前或向后调用哪个视图控制器:

在appDelegate和setter方法上创建一个变量:

 int indexVar; - (void)setIndex:(int)indexVar; 

然后在视图控制器上(向前或向后)增加值或减小值(viewDidLoad):

 (AppDelegate *)[[UIApplication sharedApplication] delegate] setIndex:]; 

沿着这些方向的东西。 这不是实现目标的确切方法,但希望它能让您朝着正确的方向前进。

使用协议:

 MyClass : UIViewController  

声明一个属性:

 @property(nonatomic) NSInteger currentIndex; @property(nonatomic) NSInteger nextIndex; 

并在方法中:

 -(void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers{ NewsTableViewController *controller = [pendingViewControllers firstObject]; self.nextIndex = [self.arrViews indexOfObject:controller]; } -(void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed{ if (completed) { self.currentIndex = self.nextIndex; } self.nextIndex = 0; } 

那里你将有当前页面。 感谢Corey Floyd在这里输入链接描述

我是通过在viewWillAppear方法中调用协议方法在每个ViewController类中创建协议来实现的。 然后在PageViewController中,每当我实例化其中一个视图控制器时,我将其委托设置为PageViewController。 这是我项目中的第三个ViewController(请注意,我已在每个视图控制器中完成此操作)

 @class ViewController3; @protocol ViewControllerPageNumber  -(void)viewWillAppearMyPageNumber:(int)myPageNumber; @end @interface ViewController3 : UIViewController @property (nonatomic, weak) id  delegate; @end 

并在viewWillAppear方法的.m文件中

 -(void)viewWillAppear:(BOOL)animated{ [self.delegate viewWillAppearMyPageNumber:3];//The 3 will be different for each ViewController } 

接下来,在PageViewController.m中,每当我实例化一个视图控制器时,我将其委托设置为self(或PageViewController)。 viewCons只是一个带有viewControllers名称的字符串数组。

 - (UIViewController *)viewControllerAtIndex:(NSUInteger)index { id vc = [[NSClassFromString([viewCons objectAtIndex:index]) alloc] init]; if([vc isMemberOfClass:[NSClassFromString(@"ViewController3") class]]){ ViewController3 *vc3=(ViewController3 *) vc; vc3.delegate=self; }else if([vc isMemberOfClass:[NSClassFromString(@"ViewController2") class]]){ ViewController2 *vc2=(ViewController2 *) vc; vc2.delegate=self; }else if([vc isMemberOfClass:[NSClassFromString(@"ViewController") class]]){ ViewController *vc1=(ViewController *) vc; vc1.delegate=self; } return vc; } 

最后,我正在实现我的自定义委托方法,在我的例子中是我在PageViewController之上设置的刷新标签文本。

 -(void)viewWillAppearMyPageNumber:(int)myPageNumber{ [self refreshLabelsOnCurrentPageWithIndex:myPageNumber]; } 

我认为最简单的解决方案是创建一个自己的ViewController类,该类具有跟踪当前显示的索引的属性。 在大多数情况下,无论如何我都需要为我的PageViewController定制一个ViewController。 在我的示例中,这是以下类。

 @interface PageZoomViewController : UIViewController @property (nonatomic) int pageIndex; @end 

然后在viewControllerAfter / Before方法中,您可以将索引传递给新页面。

 -(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { int nextPageIndex = ((PageZoomViewController *)viewController).pageIndex-1; PageZoomViewController *controller = [[PageZoomViewController alloc] initWithPageViewControlParent:self andFrame:[self frameForPagingScrollView] andPageIndex:nextPageIndex]; return controller; } 

完成下一页的动画后,您可以轻松地设置当前索引。

 -(void)pageViewController:(UIPageViewController *)thePageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed { if(completed) { index = ((PageZoomViewController *)thePageViewController.viewControllers[0]).pageIndex; } } 

希望这可以帮助!