自定义UIPageViewController的导航行为

时间:2013-03-08 19:16:50

标签: ios uipageviewcontroller

我想自定义UIPageViewController的导航行为;特别是我想导航到基于的不同页面,在屏幕上用户拖动她/他的手指。关于从哪里开始的任何指示?

1 个答案:

答案 0 :(得分:1)

页面视图控制器的卷曲导航由UIPanGestureRecognizerUITapGestureRecognizer触发。您可以在页面视图控制器的gestureRecognizers属性中找到它们。

在您的pageViewController:viewControllerBeforeViewController:方法和pageViewController:viewControllerAfterViewController:方法中,您可以在平移视图控制器的视图中询问平移手势识别器的位置,并使用它来决定导航的位置。您可能希望将决策委派给当前显示的视图控制器。

static UIPanGestureRecognizer *panRecognizerOfPageViewController(UIPageViewController *pageViewController) {
    for (id recognizer in pageViewController.gestureRecognizers) {
        if ([recognizer isKindOfClass:[UIPanGestureRecognizer class]])
            return recognizer;
    }
    return nil;
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
    viewControllerBeforeViewController:(UIViewController *)vc
{
    DetailViewController *dvc = (DetailViewController *)vc;
    UIPanGestureRecognizer *panner = panRecognizerOfPageViewController(pageViewController);
    CGPoint point = [panner locationInView:dvc.view];
    return [dvc priorViewControllerWithPoint:point];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
    viewControllerAfterViewController:(UIViewController *)vc
{
    DetailViewController *dvc = (DetailViewController *)vc;
    UIPanGestureRecognizer *panner = panRecognizerOfPageViewController(pageViewController);
    CGPoint point = [panner locationInView:dvc.view];
    return [dvc nextViewControllerWithPoint:point];
}

在我的测试中,我只需要询问平移手势识别器的位置。当手势是平移时,两个识别器都处于“可能”状态。当手势是点击时,平移识别器处于“失败”状态,但无论如何它都会报告点击触摸的位置。

当然,这不是记录在案的行为。如果您不想依赖它,则需要以其他方式访问当前触摸的位置。我可能只使用UIWindow的子类并覆盖其sendEvent:以将最近的触摸事件保存在实例变量中以便于访问。