18

私は UIPageViewController を持っていますが、ユーザーがページをどの方向に回したかを知る方法がわからないので、ページ数を適切に設定できます。

ありがとうシャニ

4

6 に答える 6

32

ヘジャジが言ったように

ジェスチャ駆動のトランジションが完了すると、このデリゲートメソッド が呼び出されます。

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];
}
于 2012-02-05T22:31:54.523 に答える
7

ジェスチャ駆動のトランジションが完了すると、このデリゲートメソッドが呼び出されます。

pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:

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

于 2012-01-15T17:01:48.453 に答える
3

「ページベース アプリケーション」テンプレートは、次の 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];
}
于 2012-01-09T11:10:26.033 に答える
2

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

于 2013-01-06T22:56:08.813 に答える
1

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

于 2015-03-08T21:28:09.847 に答える
0

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

于 2012-01-06T01:00:33.783 に答える