2012-12-14 16 views
7

私はUINavigationControllerの中にあるマスタービューコントローラを持っています。そのマスタービューコントローラーでは、その内部にUIWebViewを持つ詳細ビューコントローラーをプッシュするボタンがあります。私はこのディテール・ビュー・コントローラーがロードされたときにランドスケープ・モードになるようにします。マスタビューコントローラに戻り、強制的に再びポートレートモードに戻ります。私はこれでiOS 6を実行しています。Objective-CのiOS 6で強制的な風景の向き

私は他の同様の質問を見ましたが、それは私の目的のために働いていません。

DetailViewController *detailVC = [[DetailViewController alloc] 
             initWithNibName:@"DetailViewController" 
             bundle:nil]; 

    [self.navigationController pushViewController:detailVC 
             animated:YES]; 

私はにどこに思っている:私は詳細ビューコントローラをプッシュするとき

#pragma mark - Orientation Methods 
- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscape; 
} 

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

これは私のコードです:私は、私はこれらのメソッドを書かれているのUIViewControllerのサブクラスですLan​​dscapeViewControllerを作成しました私のLandscapeViewControllerを上のコードでサブクラス化して、それを動作させるか、またはディテール・ビュー・コントローラを適切にサブクラス化してプッシュする方法をサブクラス化します。また、ナビゲーションコントローラーがディテールビューコントローラーをポートレートからランドスケープにプッシュすることができない場合は、詳細ビューコントローラーをモーダルに表示することもできます。どこが間違っているのですか?

+0

これは私が念頭に置いていたまさにです: http://stackoverflow.com/questions/11610819/iphone-forcefully-change-orientation-from-portrait-to-landscape-on-navigation?rq = 1 – jaytrixz

答えて

8

は考慮: ビューA:唯一の肖像 - ビューB:風景だけ

私はナビゲーションコントローラでそれを行うことができませんでしたが。私がしたのは、ビューAからモーダルビューを開いてBを表示し、新しいナビゲーションコントローラをこのビューに強制することでした。

これは私のためにiOS5 +で動作しています。で

UINavigationController + Rotation_IOS6.h

#import <UIKit/UIKit.h> 

@interface UINavigationController (Rotation_IOS6) 

- (BOOL)shouldAutorotate; 
- (NSUInteger)supportedInterfaceOrientations; 
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation; 

@end 

UINavigationController + Rotation_IOS6.h

#import "UINavigationController+Rotation_IOS6.h" 

@implementation UINavigationController (Rotation_IOS6) 

- (BOOL)shouldAutorotate 
{ 
    return [self.topViewController shouldAutorotate]; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return [self.topViewController supportedInterfaceOrientations]; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return [self.topViewController preferredInterfaceOrientationForPresentation]; 
} 

@end 

:あなたはこのようなナビゲーションコントローラのカテゴリを作成する必要が

AppDelegate.m追加:次に

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ 
    return UIInterfaceOrientationMaskAll; 
} 

ビューA中:ビューAでも

- (BOOL)shouldAutorotate { 
    return YES; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return UIInterfaceOrientationPortrait; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown); 
} 

ビューBこれを行う開くには:

ViewB *vc = [[ViewB alloc] initWithNibName:@"ViewB" bundle:nil]; 

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:vc]; 

[self presentViewController:navigationController animated:YES completion:nil]; 

そして、最後に、にB表示

- (BOOL)shouldAutorotate { 
    return YES; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return UIInterfaceOrientationLandscapeRight; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft); 
} 
0

これについては、iOS 6ではちょっとしたことがありました。これまでにわかったことは次のとおりです。

まずAppleはXcode 4.5で「サポートされているインターフェイスオリエンテーション」ボタンを追加しました。これは_info.plistの "Supported interface orientationations"属性に対応します。これらのボタンは、残りのいずれかが機能する前に正しい選択肢に切り替える必要があります。 (ボタンがCVSやその他のプロセスによってロックされているため、ボタンがトグルするのを拒否したように見える場合)

次に、.window.rootViewControllerプロパティを設定し、スタック内のビューコントローラ。一般的に、ナビゲーションコントローラまたはタブコントローラのいずれかになります。

すべての回転を無効にする場合は、ボタンを使用するか、「ボトム」ビューコントローラで「shouldAutorotate」メソッドを実装してNOを返すことができます。 (メソッドを省略すると、デフォルトはYESになります)

自動回転をshouldAutorotateで無効にしているにもかかわらず、MPMoviePlayerViewControllerが表示されている場合、自動回転します。サポートされているインターフェイスの向きボタンを切り替えるだけで、これを防ぐことができます。

条件付きで他のビューコントローラを自動回転させたい場合は、より複雑になります。基本的には、「ボトム」ビューコントローラはsupportedInterfaceOrientationsメソッドを実装し、現在のtopViewControllerに基づいて適切なビットマスクを返す必要があります。これは、topViewControllerの古い "shouldAutorotateToInterfaceOrientation"メソッドを照会するルーチンで行うことができますが、それは少し醜いです。このスキームでは、回転ビューコントローラのコードを変更する必要はありませんが、VCを "supportedInterfaceOrientation"を実装するために回転させただけで修正する必要があります。 (少なくともこれは単純なコピー/ペーストです。)だれも、より良い、より一般的なスキームを思いついたようです。

関連する問題