Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 自定义UIPageViewController的导航行为_Ios_Uipageviewcontroller - Fatal编程技术网

Ios 自定义UIPageViewController的导航行为

Ios 自定义UIPageViewController的导航行为,ios,uipageviewcontroller,Ios,Uipageviewcontroller,我想自定义UIPageViewController的导航行为;具体来说,我想根据用户在屏幕上拖动手指的位置导航到不同的页面。关于从何处开始的任何指针?页面视图控制器的卷曲导航由UIPangestureRecognitizer和UICapgestureRecognitizer触发。您可以在页面视图控制器的手势识别器属性中找到这些属性 在pageViewController:viewControllerBeforeViewController:方法和pageViewController:viewCo

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

页面视图控制器的卷曲导航由
UIPangestureRecognitizer
UICapgestureRecognitizer
触发。您可以在页面视图控制器的
手势识别器
属性中找到这些属性

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:
即可将最近的触摸事件保存在实例变量中,以便于访问。

谢谢!我使用的是“基于页面的应用程序”模板,我已经将其粘贴到我的
RootViewController:UIViewController
中。它在
viewDidLoad
中将自身设置为委托:
self.pageViewController.delegate=self。但是
(UIViewController*)pageViewController:(UIPageViewController*)pageViewController viewControllerAfterViewController:(UIViewController*)vc
方法似乎不会在翻页时触发。有指针吗?请确保您的页面视图控制器
s
dataSource`已连接到实现
pageViewController:viewControllerAfterViewController:
的对象。如果我已解决了您的问题,请单击我的答案旁边的复选标记。