私は、任意の奇妙な副作用は、この実装であるわからないんだけど、このような何かを試してみて、それはあなたのために働くかどうかを確認:
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration {
if (UIInterfaceOrientationIsPortrait(orientation)) {
[[NSBundle mainBundle] loadNibNamed:@"MenuView" owner:self options:nil];
if (orientation == UIInterfaceOrientationPortraitUpsideDown) {
self.view.transform = CGAffineTransformMakeRotation(M_PI);
}
} else if (UIInterfaceOrientationIsLandscape(orientation)){
[[NSBundle mainBundle] loadNibNamed:@"MenuViewLandscape" owner:self options:nil];
if (orientation == UIInterfaceOrientationLandscapeLeft) {
self.view.transform = CGAffineTransformMakeRotation(M_PI + M_PI_2);
} else {
self.view.transform = CGAffineTransformMakeRotation(M_PI_2);
}
}
}
これはあなたのMenuViewでそのファイルの所有者とみなし、 MenuViewLandscape XIBは両方ともMenuViewControllerに設定され、ビューアウトレットは両方のXIBに設定されます。 loadNibNamed
を使用する場合は、すべてのコンセントをローテーション時に正しく再接続する必要があります。あなたはiOSの4のために構築している場合
、あなたはまた、これらとloadNibNamed
行を置き換えることができます:
UINib *nib = [UINib nibWithNibName:@"MenuView" bundle:nil];
UIView *portraitView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0];
self.view = portraitView;
と
UINib *nib = [UINib nibWithNibName:@"MenuViewLandscape" bundle:nil];
UIView *landscapeView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0];
self.view = landscapeView;
これらはあなたがすぐに表示したいのUIViewが続くことを前提としXIBのファイル所有者とFirst Responderプロキシオブジェクト。
次に、インターフェイスの向きが正しいかどうかを確認する必要があります。既定の縦向きでないビューのすべてについて、ビューのtransform
プロパティを設定し、CGAffineTransformMakeRotation()
に上記の例に示す適切な値を使用してビューを回転します。
NIBを余分に読み込むことなく、ローテーションだけで問題を解決できる場合があります。ただし、MenuViewController
の新しいインスタンスをすべて読み込んで、そのビューを既存のMenuViewController
のビューに設定すると、ライフサイクルイベントとローテーションイベントで奇妙な動作が発生する可能性があるため、上記の例を試してみると安全です。また、新しいMenuViewController
インスタンスを作成する手間が省け、ビューを必要とするだけです。
希望すると便利です。
ジャスティン
これでどれ運:また、あなたがこのような他のソリューションを使用することを可能にしながら、だからそれはあなたに単一のビューコントローラクラスの利点のほとんどを与えますか? – RefuX
以下の回答を参照してください –