タイトルは、私が実装しようとしていることを示唆していると思います。ここでは、私が達成しようとしていることと、どのように同じことを試みたが部分的に成功したかを説明しています。
VC-ViewController NC-NavigationController
アプリケーションの RootVC として NC を設定しました。supportedInterfaceOrientations と shouldAutorotate メソッドをオーバーライドする NC のカテゴリを作成しました。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
UINavigationController *appNavController = [[UINavigationController alloc]init];
appNavController.view.backgroundColor = [[UIColor redColor]colorWithAlphaComponent:0.5];
self.window.rootViewController = appNavController;
[self.window addSubview:appNavController.view];
FirstViewController *_firstViewController = [[FirstViewController alloc]init];
[appNavController pushViewController:_firstViewController animated:YES];
[_firstViewController release];
return YES;
}
UINavigationController のカテゴリ //UINavigationController.m
@implementation UINavigationController(Rotation)
-(BOOL)shouldAutorotate
{
return [[self.viewControllers lastObject] shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations
{
return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}
すべての方向をサポートする FirstVC を追加しています。ここでは問題なく動作します。
//FirstViewControlle.m
-(BOOL)shouldAutorotate
{
return YES;
}
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskAll;
}
最初の VC から、pushViewController を使用して別の VC (SecondVC) を NC に追加しています。
ケース 1: firstVC の向きがランドスケープで、SecondVC が NC で押されると、回転がブロックされ、SecondVC がランドスケープでロードされます。
ケース 2: firstVC がポートレート モードで、SecondVC が NC にプッシュされ、回転がブロックされている (shouldAutorotate が NO に設定されているため) が、2 番目の VC がポートレート モードでロードされている場合に問題が発生します。ここでは、secondVC の supportedInterfaceOrientations が UIInterfaceOrientationMaskLandscape 値に設定されていますが、向きを強制することはできません。 2番目のVCが表示されている限り、NCの向きが何であれ、2番目のVCをランドスケープでロードし、ランドスケープでロックする必要があります。
//SecondViewControlle.m
-(BOOL)shouldAutorotate
{
return NO;
}
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscape;
}
上記のコードを実装しながら、次の Q&A Force a Portrait...を参照しました。
すべての提案と解決策は大歓迎です。前もって感謝します。