Как я могу знать, перевернулся ли UIPageViewController вперед или назад?
У меня есть UIPageViewController, и я просто не могу понять, как узнать, в каком направлении пользователь перевернул страницу, чтобы я мог соответствующим образом установить количество страниц.
Спасибо Шани
6 ответов
Когда пользователь переворачивает страницу, UIPageViewController's 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
Вы можете знать направление.
Шаблон "Приложение на основе страницы" предоставляет следующие 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];
}
Вы можете добавить свойство pageIndex в ваши контроллеры представления, которые служат страницами. IOW, когда вы создаете контроллеры представления для viewControllerBeforeViewController & viewControllerAfterViewController (или когда вы вызываете setViewControllers), сохраняйте pageIndex в тех контроллерах представления, на которые вы можете ссылаться всякий раз, когда вам нужно знать индекс.
Отличные ответы для обработки контроллера страницы. Я обнаружил, что контроллер представления, который был добавлен как страница, будет вызывать viewWillAppear, когда пользователь перемещает страницу в представление, а также будет вызывать viewDidAppear после завершения.