UIPageViewControllerを使用していますが、ユーザーがページをめくった方向を知る方法がわからないため、ページ数を適切に設定できます。
ありがとうシャニ
ユーザーがページをめくると、UIPageViewControllerのsetViewControllers:
メソッドが呼び出されます。このメソッドは、必要な情報を提供するタイプUIPageViewControllerNavigationDirection
の引数を受け取ります。
ヘジャジが言ったように
ジェスチャ駆動の遷移が完了すると、このデリゲート 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];
}
ジェスチャ駆動の遷移が完了すると、このデリゲート method が呼び出されます。
pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:
したがって、previousViewControllers
パラメータとpageViewController.viewControllers
を比較することで、方向を知ることができます。
「ページベースのアプリケーション」テンプレートは、次の2つの方法を提供します。
- (NSUInteger)indexOfViewController:(DataViewController *)viewController;
ビューコントローラを指定してインデックスを検索する方法
- (DataViewController *)viewControllerAtIndex:(NSUInteger)index
インデックスを指定してViewControllerをインスタンス化する方法。
正しいアニメーションを作成するには、現在のViewControllerのインデックスを知る必要があります。ページベースのテンプレートメソッドはそれに最適です。次に、「ジャンプ」インデックスと「現在の」インデックスを比較するだけです。
アイデアを得るためのコードは次のとおりです。
- (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];
}
ページとして機能するViewControllerに「pageIndex」プロパティを追加できます。 IOW、viewControllerBeforeViewControllerおよびviewControllerAfterViewControllerのビューコントローラーを作成するとき(またはsetViewControllersを呼び出すとき)、インデックスを知る必要があるときにいつでも参照できるビューコントローラーにpageIndexを格納します。
ページコントローラの処理に関する優れた回答。ページとして追加されたViewControllerは、ユーザーがページをビューにスライドするとviewWillAppearを呼び出し、完了時にviewDidAppearも呼び出すことがわかりました。