Как я могу знать, перевернулся ли UIPageViewController вперед или назад? - PullRequest
18 голосов
/ 06 января 2012

У меня есть UIPageViewController, и я просто не могу понять, как узнать, в каком направлении пользователь перевернул страницу, чтобы я мог соответствующим образом установить количество страниц.

Спасибо Шани

Ответы [ 6 ]

32 голосов
/ 06 февраля 2012

Как сказал Хиджази

После завершения управляемого жестом перехода этот делегат вызывается метод :

pageViewController: didFinishAnimating: previousViewControllers: transitionCompleted:

Следует пояснить, что completed будет YES, если страница была полностью перевернута, и NO, если страница на самом деле не перевернулась.Случай NO возникает, например, когда пользователь просто поднимает угол страницы, а затем кладет его обратно, не переворачивая страницу.

Это концепция, которую вы захотите реализовать:

- (void)pageViewController:(UIPageViewController *)pvc didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
    // If the page did not turn
    if (!completed)
    {
        // You do nothing because whatever page you thought 
        // the book was on before the gesture started is still the correct page
        return;
    }

    // This is where you would know the page number changed and handle it appropriately
    // [self sendPageChangeNotification:YES];
}
7 голосов
/ 15 января 2012

После завершения управляемого жестом этого делегата вызывается метод :

pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:

Таким образом, сравнивая параметр previousViewControllers и pageViewController.viewControllers, вы можете узнать направление.

3 голосов
/ 09 января 2012

Шаблон «Приложение на основе страницы» предоставляет следующие 2 метода:

- (NSUInteger)indexOfViewController:(DataViewController *)viewController; 

метод поиска индекса по заданному контроллеру представления

- (DataViewController *)viewControllerAtIndex:(NSUInteger)index

метод создания экземпляра контроллера представления по индексу.

Для создания правильной анимации вам нужно знать индекс вашего текущего контроллера вида. Методы шаблонов на основе страниц идеально подходят для этого. Затем вы просто сравниваете свой индекс перехода с текущим индексом.

Вот некоторый код, чтобы понять идею:

- (void)jumpToPage:(NSInteger)page {    
   // find current index
   DataViewController *currentViewController = (DataViewController *)[self.pageViewController.viewControllers lastObject];
   NSUInteger index = [self indexOfViewController:currentViewController];

   // choosing the correct direction
   // if the 'current' is smaller than the 'jump to' page, then choose forward
   // vice versa
   UIPageViewControllerNavigationDirection direction;
   if (index < page) {
       direction = UIPageViewControllerNavigationDirectionForward;
   } else {
       direction = UIPageViewControllerNavigationDirectionReverse;
   }

   // choose view controllers according to the orientation
   NSArray *viewControllers;
   if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
       DataViewController *rightViewController = [self viewControllerAtIndex:page];
       viewControllers = [NSArray arrayWithObject:rightViewController];
   } else {
       DataViewController *rightViewController = [self viewControllerAtIndex:page];
       DataViewController *leftViewController = [self viewControllerAtIndex:page-1];
       viewControllers = [NSArray arrayWithObjects:leftViewController, rightViewController, nil];
   }

   // fire the method which actually trigger the animation
   [self.pageViewController setViewControllers:viewControllers 
                                     direction:direction 
                                      animated:YES 
                                    completion:nil];
}
2 голосов
/ 07 января 2013

Вы можете добавить свойство pageIndex для ваших контроллеров представления, которые служат страницами. IOW, когда вы создаете контроллеры представления для viewControllerBeforeViewController & viewControllerAfterViewController (или когда вы вызываете setViewControllers), сохраняйте pageIndex в тех контроллерах представления, на которые вы можете ссылаться всякий раз, когда вам нужно знать индекс.

1 голос
/ 09 марта 2015

отличных ответов для обработки контроллера страницы.Я обнаружил, что контроллер представления, который был добавлен как страница, будет вызывать viewWillAppear, когда пользователь перемещает страницу в представление, а также будет вызывать viewDidAppear после завершения.

0 голосов
/ 06 января 2012

Когда пользователь переворачивает страницу, будет вызван метод setViewControllers: UIPageViewController.Этот метод получает аргумент типа UIPageViewControllerNavigationDirection, который даст вам необходимую информацию.

...