2013-03-08 3 views

ответ

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:, чтобы сохранить последнее событие касания в переменной экземпляра для легкого доступа.

+0

Спасибо! Я использую шаблон «Page на основе приложения», и я вложил его в свой «RootViewController: UIViewController ». Он устанавливает себя как делегат в 'viewDidLoad':' self.pageViewController.delegate = self; '. Но '' UIViewController * pageViewController: (UIPageViewController *) pageViewController viewControllerAfterViewController: (UIViewController *) vc' метод, похоже, не срабатывает при повороте страницы. Любые указатели? –

+0

Убедитесь, что 'dataSource' контроллера просмотра страницы подключен к объекту, который реализует' pageViewController: viewControllerAfterViewController: '. –

+0

Супер, он работает! –

Смежные вопросы