0

我想自定义UIPageViewController;的导航行为 具体来说,我想根据用户在屏幕上拖动她/他的手指的位置导航到不同的页面。关于从哪里开始的任何指示?

4

1 回答 1

1

页面视图控制器的 curl 导航由 aUIPanGestureRecognizer和触发UITapGestureRecognizer。您可以在页面视图控制器的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:来将最近的触摸事件保存在一个实例变量中以便于访问。

于 2013-03-09T09:10:17.390 回答