2013-07-18 17 views
12

私はUIPageViewControllerを内部に簡単なUIViewControllerを持っています。UIPageViewController +自動レイアウト回転の問題

UIViewControllerにサブビューがない場合、回転したときにビューのサイズが正しく変更されます。 (緑色の背景が緑色)。

portraitlandscape

のUIViewControllerは、固定フレームとサブビューを持つ場合に回転するとき、そのビューを正しくリサイズ。 (隅に黄色の四角のある緑色の背景が緑色)。

portraitlandscape

のUIViewControllerは、そのスーパーを埋めるために設定された自動レイアウト制約を持つサブビューを持っている場合は回転させると、そのビューはもはや正しくサイズを変更しません。 (黄色の背景は、UIPageViewControllerの赤い背景が表示されています)。私が使用して自動レイアウトコードは次のとおりです。

UIView *v = [[UIView alloc] init]; 
[v setTranslatesAutoresizingMaskIntoConstraints:NO]; 
[v setBackgroundColor:[UIColor yellowColor]]; 
[[self view] addSubview:v]; 

NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(v); 

NSArray *cs = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[v]|" options:0 metrics:nil views:viewsDictionary]; 
[[self view] addConstraints:cs]; 

cs = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[v]|" options:0 metrics:nil views:viewsDictionary]; 
[[self view] addConstraints:cs]; 

portraitlandscape

なぜサブビューの自動レイアウトはそのスーパーに影響を与えるのでしょうか?これは、UIPageViewController内に含まれている場合にのみ発生します。

答えて

0

私はそれを考え出した:

を私は、コンテナのコントローラクラスで[[_pageViewController view] setTranslatesAutoresizingMaskIntoConstraints:NO];と呼ばれ、(退屈宇宙飛行士が述べたように、またはビュー)明示的にそのビューに自動レイアウト制約を設定していませんでした。

+2

ちょっと高齢者 - 私はあなたの質問に記載された全く同じ問題を抱えています。あなたはこの答えで少しのサンプルコードを提供することができますか?私はVisual Format Language(あなたと同じように)を使って自動レイアウトですべてをやっています。回転すると、私のUIPageViewControllerがあなたの行ったことを正確に行います。あなたは「そしてそのビューに自動レイアウト制約を明示的に設定していない」と言っています。もしあなたがそのコードを提供できれば、私は非常に助けになり、より完全な答えを提供します。ありがとう! – DiscDev

7

ページビューコントローラのビューは、ページを表すビューのスーパービューではありません。ページビューコントローラのビューにはカスタムスクロールビューサブクラスで構成されるビュー階層があり、スクロールビューには3つの汎用ビューサブクラスがあります。これらのサブクラスはインデックス0〜2に含まれるビューコントローラのビュー用です。これらはスーパービューとして機能します。あなたの含まれているビュー。これらのビューに自動レイアウト制約を設定する必要があります。しかし、自動サイズ変更マスクを使用して自動レイアウト制約に変換する方がはるかに簡単です。

+0

自動サイズ変更マスクを使用すると、この問題は解決します。私はまだ含まれているUIViewControllerのビューがその子ビューの自動レイアウト制約の影響を受けるのかどうかは不明です。 – Senior

10

私もこの問題を抱えていました。以前の回答はあまり役に立たないようでした。 PageViewControllerで使用されるスクロールビューに制約を追加する必要がありました。

// Add Paging View Controller 
self.addChildViewController(self.pageViewController) 
self.pageViewController.didMoveToParentViewController(self) 
self.containerView.addSubview(self.pageViewController.view) 

// Add Constraints 
var verticalConstraints:Array = NSLayoutConstraint.constraintsWithVisualFormat("V:|[View]|", options: nil, metrics: nil, views: ["View":self.pageViewController.view]) 
var horizontalConstraints:Array = NSLayoutConstraint.constraintsWithVisualFormat("|[View]|", options: nil, metrics: nil, views: ["View":self.pageViewController.view]) 

self.pageViewController.view.setTranslatesAutoresizingMaskIntoConstraints(false) 
self.containerView.addConstraints(verticalConstraints) 
self.containerView.addConstraints(horizontalConstraints) 

// Add Constraints for the Scrollview 
//This line is a bit of a hack. If Apple ever changes the structure of the UIPageViewController, this could break. 
let scrollView = self.pageViewController.view.subviews.first! as UIView 
scrollView.setTranslatesAutoresizingMaskIntoConstraints(false) 
verticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|[View]|", options: nil, metrics: nil, views: ["View":scrollView]) 
horizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("|[View]|", options: nil, metrics: nil, views: ["View":scrollView]) 
self.pageViewController.view.addConstraints(verticalConstraints) 
self.pageViewController.view.addConstraints(horizontalConstraints) 
+0

いいえ、私はこの答えでコンテナ内のUIPageViewControllerで私のAutoLayoutの問題を修正することができました。 – Paludis

+0

ありがとう!あなたは私の師です:) – Unmerciful

0

@宇宙飛行士の回答がほとんど私のために働いた。自動レイアウト制約に変換する自動サイズ調整マスクを残した以外に唯一行ったことは、親ビューに追加する前にUIPageViewControllerのビューフレームを設定することです。

[self addChildViewController:pageViewController]; 
pageViewController.view.frame = self.view.frame; 
[self.view addSubview:pageViewController.view]; 
[pageViewController didMoveToParentViewController:self]; 

枠を設定せずに、子ビューコントローラが表示され、位置が正しく任意の方向ではなく、そのサブビューが適切にレイアウトされることはありませんされます。