我想自定义UIPageViewController
的导航行为;特别是我想导航到基于的不同页面,在屏幕上用户拖动她/他的手指。关于从哪里开始的任何指示?
答案 0 :(得分:1)
页面视图控制器的卷曲导航由UIPanGestureRecognizer
和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:
以将最近的触摸事件保存在实例变量中以便于访问。