web-dev-qa-db-ja.com

UIPageViewControllerが順方向または逆方向に反転したかどうかを確認するにはどうすればよいですか?

UIPageViewControllerを使用していますが、ユーザーがページをめくった方向を知る方法がわからないため、ページ数を適切に設定できます。

ありがとうシャニ

18
shannoga

ユーザーがページをめくると、UIPageViewControllerのsetViewControllers:メソッドが呼び出されます。このメソッドは、必要な情報を提供するタイプUIPageViewControllerNavigationDirectionの引数を受け取ります。

0
jonkroll

ヘジャジが言ったように

ジェスチャ駆動の遷移が完了すると、このデリゲート method が呼び出されます。

pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:

明確にする必要があるのは、ページが完全にめくられた場合はcompletedYESになり、ページが実際にめくられなかった場合は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];
}
32
roff

ジェスチャ駆動の遷移が完了すると、このデリゲート method が呼び出されます。

pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:

したがって、previousViewControllersパラメータとpageViewController.viewControllersを比較することで、方向を知ることができます。

7
Hejazi

「ページベースのアプリケーション」テンプレートは、次の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];
}
3
Ikhsan Assaat

ページとして機能するViewControllerに「pageIndex」プロパティを追加できます。 IOW、viewControllerBeforeViewControllerおよびviewControllerAfterViewControllerのビューコントローラーを作成するとき(またはsetViewControllersを呼び出すとき)、インデックスを知る必要があるときにいつでも参照できるビューコントローラーにpageIndexを格納します。

2
Mark Krenek

ページコントローラの処理に関する優れた回答。ページとして追加されたViewControllerは、ユーザーがページをビューにスライドするとviewWillAppearを呼び出し、完了時にviewDidAppearも呼び出すことがわかりました。

1
cynistersix