Подтвердить что ты не робот

Как я могу узнать, переместился ли UIPageViewController вперед или наоборот?

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

Спасибо Шани

4b9b3361

Ответ 1

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

Ответ 2

Как сказал Хеязи

После перехода с помощью жестов этот делегат называется:

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];
}

Ответ 3

После того, как переход с помощью жестов завершает этот делегат метод, вызывается:

pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:

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

Ответ 4

Шаблон "Page на основе" предоставляет следующие два метода:

- (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];
}

Ответ 5

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

Ответ 6

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