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