13

子を持つプログラムでビューコントローラを設定しましたUIPageViewController。これには、プログラムによっても設定されているさまざまな他のView Controllerが表示されます。これらのビューコントローラのビューはtranslatesAutoresizingMaskIntoConstraintsYESに設定されていますが、ページビューコントローラのビューは制約を使用してトップビューコントローラに位置します。UIPageViewControllerは子ビューコントローラのサイズを変更しません

問題は、ユーザーがデバイスを回転させると、ページビューコントローラーはフレームのサイズを変更しますが、子ビューコントローラーは変更しないということです。 didRotateFromInterfaceOrientationによって、そのフレームはまだ古い方向からのものです。子ビューコントローラで回転メソッドが呼び出されたことを確認しましたが、フレームは変更されません。私はこのようなページビューコントローラの設定

self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; 
self.pageViewController.view.backgroundColor = [UIColor clearColor]; 
self.pageViewController.view.translatesAutoresizingMaskIntoConstraints = NO; 
self.pageViewController.dataSource = self; 
self.pageViewController.delegate = self; 
[self.pageViewController willMoveToParentViewController:self]; 
[self.view addSubview:self.pageViewController.view]; 
[self addChildViewController:self.pageViewController]; 
[self.pageViewController didMoveToParentViewController:self]; 

self.currentPageIndex = 0; 

self.currentPageController = [self pageForIndex:self.currentPageIndex]; 
self.currentPageController.delegate = self; 
[self.pageViewController setViewControllers:@[self.currentPageController] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL]; 

を私はsetNeedsLayoutを呼び出して試してみたが、それは不器用な回転アニメーションだと私はスワイプ次ページも適切にリサイズされていません。

なぜページビューコントローラは子ビューコントローラのサイズを変更しないのですか?これを行うにはどうすればよいですか?

ありがとうございます!

+0

問題の解決方法をお探しですか?私は同じ問題で立ち往生しています。 – AlexR

+0

問題は、子コントローラの-didRotateFromInterfaceOrientationが決して呼び出されないことです。親ビューコントローラ-didRotateFromInterfaceOrientationから手動で呼び出して解決しました。 –

+0

クリイル・ビュー・コントローラーの方法は何ですか?あなたは方向変更を処理するために呼び出していますか? – Satyam

答えて

-1

コントローラのビューを別のコントローラのビューに直接追加して、ローテーションとライフサイクルのメソッドを呼び出すことが最善の方針ではありません。コントローラーの階層に追加するとうまくいくと思いますが、それについてはあまりコメントすることはできません。

私はタブバーナビゲータでテストし、私のUIPageViewControllerは、UIPageViewControllerに表示されていたコントローラと共にイベントを取得しました。私はコントローラをUINavigationControllerにプッシュすると同じ結果が得られるだろうと推測しています。

UIPageVIewControllerを他のコントローラのビューに追加するよりも標準的な方法で表示することをお勧めします。

+0

を共有してください。ページビューコントローラーは常にフルスクリーンでなければなりません。 iPadのようなデバイスでは、ビューの一部になることがあります。そしてそれは質問で述べたように実装されなければなりません。それを達成する他の方法があれば私を訂正してください。 – Satyam

6

まず、自動レイアウト、プログラムまたはストーリーボードですべてを設定します。次に、親ビューコントローラの向きの変更をキャッチし、UIPageViewControllerのビューをレイアウトに強制的に再配置します。

これは私の作業コード(iOS 8.0以降)です。 childController1は、制約を使用してすべてのレイアウトでストーリーボードにセットアップされ、[self.storyboard instantiateViewControllerWithIdentifier:@"ChildControllerId"]でインスタンス化されました。

- (void)createPageController 
{ 
... 
    pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; 
    pageController.dataSource = self; 
    [pageController setViewControllers:@[childController1] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; 
    [self addChildViewController:pageController]; 
    [self.view addSubview:pageController.view]; 
    UIView *pageView = pageController.view; 
    pageView.translatesAutoresizingMaskIntoConstraints = NO; 
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[pageView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(pageView)]]; 
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[pageView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(pageView)]]; 
    [pageController didMoveToParentViewController:self]; 
... 
} 
- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
{ 
    [pageController.view setNeedsLayout]; 
    [super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator]; 
} 

希望します。

関連する問題