2010-11-19 12 views
9

iPadアプリケーションでUIViewControllerと2つのXIBを使用して向きを変更したい場合は、MenuViewとMenuViewLandscapeとしましょう。1つのUIViewControllerと2つのXIBを持つiPadでのハンドルの向きの変更

MenuViewControllerのwillRotateToInterfaceOrientationメソッドでは、横置きモードで別のコントローラを使用せずにXIBをどのように変更できますか?

if(toInterfaceOrientation != UIInterfaceOrientationPortrait){ 
    MenuViewController *landscape = [[MenuViewController alloc] 
             initWithNibName: @"MenuViewLandscape" 
             bundle:nil 
            ];   
    [self setView:landscape.view]; 
} 
else { 
    MenuViewController *potrait = [[MenuViewController alloc] 
            initWithNibName: @"MenuView" 
            bundle:nil 
            ];   
    [self setView:potrait.view]; 
} 

をしかし、私が風景に行くときは、景観ビューコントロールが正常に回転しないXIBを表示:

私は、次のコードを使用しています。

+0

これでどれ運:また、あなたがこのような他のソリューションを使用することを可能にしながら、だからそれはあなたに単一のビューコントローラクラスの利点のほとんどを与えますか? – RefuX

+0

以下の回答を参照してください –

答えて

12

私は、任意の奇妙な副作用は、この実装であるわからないんだけど、このような何かを試してみて、それはあなたのために働くかどうかを確認:

-(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インスタンスを作成する手間が省け、ビューを必要とするだけです。

希望すると便利です。

ジャスティン

+0

こんにちはジャスティン。私はあなたの解決策を試してみました。しかし、風景の場合はすべてがぼやけています。正しく回転していますが、ぼやけたテキストやラベルで、すべてがぼやけています。いくつかの線はギザギザです。何か案は ?ありがとうございました。 – TrekOnTV2017

1

おそらく、ジョン・ロドリゲスからの答えはここにあなたがやりたいことになります。

Want to use muliple nibs for different iphone interface orientations

次の2つのUIViewControllerクラス、ポートレートモードの基底クラスとそのサブクラスのを持っている場合ランドスケープモードでは、ほとんどすべてのコードを基底クラスに入れることができます。

Easiest way to support multiple orientations? How do I load a custom NIB when the application is in Landscape?

関連する問題