代わりに、iOS6から追加されたメソッドのsupportedInterfaceOrientations、shouldAutorotateを使用する。
シングルビューだけであれば上記メソッドの実装だけで済むが、これにUINavigationController、UITabBarControllerが加わるビューのアプリの場合は修正範囲は大きい。
UINavigationControllerまたはUITabBarControllerをサブクラス化してオーバライドし、UINavigationControllerまたはUITabBarControllerの中でsupportedInterfaceOrientations、shouldAutorotateを実装する必要がある。
また、AppDelegateで古いプロジェクトの場合、メインwindowにaddSubviewでUINavigationControllerまたはUITabBarControllerを追加していることがあるが、この場合は画面回転が動作しない。
[window addSubview:[HogeNavigationController view]];
代わりに、rootViewControllerにUINavigationControllerまたはUITabBarControllerをセットするコードに置換する。
self.window.rootViewController = self.customTabBarController;
下記は、UITabBarControllerが最上位でその下層にUINavigationControllerがぶら下がっているビューのアプリの場合のコード。
1. AppDelegate.h
#import
#import "CustomTabBarController.h"
@interface AppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
UINavigationController *navigationController;
CustomTabBarController *customTabBarController;
}
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) UINavigationController *navigationController;
@property (strong, nonatomic) CustomTabBarController *customTabBarController;
@end
2. AppDelegate.m
#import "CustomTabBarController.h"
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// ウィンドウの設定と表示
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// ViewControllersを入れる配列
NSMutableArray *viewControllers = [[NSMutableArray alloc] init];
// 第一画面
HogeViewController *masterViewController = [[[HogeViewController alloc] initWithNibName:@"HogeView" bundle:nil] autorelease];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:masterViewController];
[viewControllers addObject:navController];
// 第二画面
FugaViewController *masterViewController2 = [[[FugaViewController alloc] initWithNibName:@"FugaView" bundle:nil] autorelease];
UINavigationController *navController2 = [[UINavigationController alloc] initWithRootViewController:masterViewController2];
[viewControllers addObject:navController2];
// タブバーコントローラーを作成
self.customTabBarController = [[[CustomTabBarController alloc] init] autorelease];
// タブバーコントローラーにナビゲーション付きのビューを追加
[self.customTabBarController setViewControllers:viewControllers];
self.window.rootViewController = self.customTabBarController;
[window makeKeyAndVisible];
}
3. CustomTabBarController.h
#import
@interface CustomTabBarController : UITabBarController
@end
4. CustomTabBarController.m
#import "CustomTabBarController.h"
@interface CustomTabBarController ()
@end
@implementation CustomTabBarController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}
- (BOOL)shouldAutorotate;
{
return YES;
}
@end
UITabBarControllerがなく、最上位がUINavigationControllerの場合は、UINavigationControllerのサブクラスを作成し、このサブクラスの中でsupportedInterfaceOrientations、shouldAutorotateメソッドを実装する。
iOS5以前のiOSデバイスでの動作を保証するために、iOS5以前でそれぞれのビューで実装していた、shouldAutorotateToInterfaceOrientationメソッドはそのまま残しておくことが望ましい。
参考記事:
http://hiiro-game.seesaa.net/article/293374528.html
http://ken-plus.blogspot.jp/2012/09/ios6-uinavigationcontrollerautorotate.html
http://d.hatena.ne.jp/paraches/20120922/1348244105
【画面の回転の最新記事】
UINavigationController と UITabViewController を継承して子クラスに回転関連のふたつのメソッドを追加する部分について、少し工夫しました。
UIViewController+AppViewControllerCategoryを作成してふたつのメソッドをカテゴリで追加してみたところ、iOS6では動作しました。全UIViewController に同じ動作のメソッドを追加できるので便利かなと思います。
横画面固定のゲーム画面のViewControllerがある場合は、オーバーライドで個別に対応可能できるかと思います(未確認)