我怎么知道UIPageViewController是否向前翻转或反转?

时间:2012-01-05 23:49:59

标签: ios uipageviewcontroller

我有一个UIPageViewController,我无法弄清楚如何知道用户转向页面的方向,以便我可以适当地设置页数。

由于 沙尼

6 个答案:

答案 0 :(得分:32)

正如Hejazi所说

  

手势驱动转换完成后,此委托method   被称为:

     

pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:

应该澄清的部分是,completed如果页面完全转换则为YES,如果页面实际上没有转动则为NO。例如,当用户只是拉起页面的一角然后将其放回而不翻页时,NO就会出现这种情况。

这是您要实施的概念:

- (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;
    }

    // This is where you would know the page number changed and handle it appropriately
    // [self sendPageChangeNotification:YES];
}

答案 1 :(得分:7)

在手势驱动的转换完成后,将调用此委托method

pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:

因此,通过比较previousViewControllers参数和pageViewController.viewControllers,您可以知道方向。

答案 2 :(得分:3)

“基于页面的应用程序”模板提供以下两种方法:

- (NSUInteger)indexOfViewController:(DataViewController *)viewController; 

给定视图控制器的索引的方法

- (DataViewController *)viewControllerAtIndex:(NSUInteger)index

给定索引实例化视图控制器的方法。

要制作正确的动画,您需要知道当前视图控制器的索引。基于页面的模板方法非常适合。然后,您只需比较“跳转到”索引和“当前”索引。

以下是一些获得这个想法的代码:

- (void)jumpToPage:(NSInteger)page {    
   // find current index
   DataViewController *currentViewController = (DataViewController *)[self.pageViewController.viewControllers lastObject];
   NSUInteger index = [self indexOfViewController:currentViewController];

   // choosing the correct direction
   // if the 'current' is smaller than the 'jump to' page, then choose forward
   // vice versa
   UIPageViewControllerNavigationDirection direction;
   if (index < page) {
       direction = UIPageViewControllerNavigationDirectionForward;
   } else {
       direction = UIPageViewControllerNavigationDirectionReverse;
   }

   // choose view controllers according to the orientation
   NSArray *viewControllers;
   if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
       DataViewController *rightViewController = [self viewControllerAtIndex:page];
       viewControllers = [NSArray arrayWithObject:rightViewController];
   } else {
       DataViewController *rightViewController = [self viewControllerAtIndex:page];
       DataViewController *leftViewController = [self viewControllerAtIndex:page-1];
       viewControllers = [NSArray arrayWithObjects:leftViewController, rightViewController, nil];
   }

   // fire the method which actually trigger the animation
   [self.pageViewController setViewControllers:viewControllers 
                                     direction:direction 
                                      animated:YES 
                                    completion:nil];
}

答案 3 :(得分:2)

您可以将“pageIndex”属性添加到充当页面的视图控制器中。 IOW,当你为viewControllerBeforeViewController&amp;创建视图控制器时viewControllerAfterViewController(或当你调用setViewControllers时),将pageIndex存储在那些你可以在需要知道索引时引用的视图控制器中。

答案 4 :(得分:1)

页面控制器处理的好答案。我发现添加为页面的视图控制器会在用户将页面滑入视图时调用viewWillAppear,并在完成后调用viewDidAppear。

答案 5 :(得分:0)

当用户翻页时,将调用UIPageViewController的setViewControllers:方法。此方法接收类型UIPageViewControllerNavigationDirection的参数,该参数将为您提供所需的信息。