У меня есть UIPageViewController, и я просто не могу понять, как узнать, в каком направлении пользователь перевернул страницу, чтобы я мог правильно настроить счет страницы.
Спасибо Шани
У меня есть UIPageViewController, и я просто не могу понять, как узнать, в каком направлении пользователь перевернул страницу, чтобы я мог правильно настроить счет страницы.
Спасибо Шани
Когда пользователь поворачивает страницу, вызывается метод UIPageViewController setViewControllers:
. Этот метод получает аргумент типа UIPageViewControllerNavigationDirection
, который предоставит вам необходимую информацию.
Как сказал Хеязи
После перехода с помощью жестов этот делегат называется:
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];
}
После того, как переход с помощью жестов завершает этот делегат метод, вызывается:
pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:
Итак, сравнивая параметр previousViewControllers
и pageViewController.viewControllers
, вы можете знать направление.
Шаблон "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];
}
Вы можете добавить свойство "pageIndex" к вашим контроллерам представлений, которые служат в качестве страниц. IOW, когда вы создаете контроллеры представления для viewControllerBeforeViewController и viewControllerAfterViewController (или когда вы вызываете setViewControllers), храните pageIndex в тех диспетчерах представления, которые вы можете ссылаться, когда вам нужно знать индекс.
отличные ответы на вопросы о работе с контроллером страниц. Я обнаружил, что контроллер вида, который был добавлен в качестве страницы, вызовет viewWillAppear, когда пользователь переместит страницу в поле зрения, а также после этого вызовет viewDidAppear.