我有一个UIPageViewController,我无法弄清楚如何知道用户转向页面的方向,以便我可以适当地设置页数。
由于 沙尼
答案 0 :(得分:32)
正如Hejazi所说
手势驱动转换完成后,此委托method 被称为:
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];
}
答案 1 :(得分:7)
在手势驱动的转换完成后,将调用此委托method:
pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:
因此,通过比较previousViewControllers
参数和pageViewController.viewControllers
,您可以知道方向。
答案 2 :(得分:3)
“基于页面的应用程序”模板提供以下两种方法:
- (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];
}
答案 3 :(得分:2)
您可以将“pageIndex”属性添加到充当页面的视图控制器中。 IOW,当你为viewControllerBeforeViewController&amp;创建视图控制器时viewControllerAfterViewController(或当你调用setViewControllers时),将pageIndex存储在那些你可以在需要知道索引时引用的视图控制器中。
答案 4 :(得分:1)
页面控制器处理的好答案。我发现添加为页面的视图控制器会在用户将页面滑入视图时调用viewWillAppear,并在完成后调用viewDidAppear。
答案 5 :(得分:0)
当用户翻页时,将调用UIPageViewController的setViewControllers:
方法。此方法接收类型UIPageViewControllerNavigationDirection
的参数,该参数将为您提供所需的信息。