Copyright (C) iPhoneアプリ開発備忘録 All rights reserved.
ブログ内で記したコード、内容の正確性は保証いたしません。
記載内容を実装したことにより発生した不具合・損害等の責任は一切負いません。



2012年09月22日

iOS6でUITabBarControler+UINavigationControllerのアプリに画面回転を実装する



iOS5までは、画面の回転はshouldAutorotateToInterfaceOrientationで実装していたが、このメソッドはiOS6でdeprecatedとなったため、デバイスを回転してもshouldAutorotateToInterfaceOrientationは呼ばれない。

代わりに、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


【画面の回転の最新記事】
posted by mobileDeveloper at 23:08 | Comment(1) | TrackBack(0) | 画面の回転 はてなブックマーク - iOS6でUITabBarControler+UINavigationControllerのアプリに画面回転を実装する | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
大変参考になる記事をありがとうございました。自作のアプリでNavigationControllerを使っていますが、上下逆の画面が出るようになりました。

UINavigationController と UITabViewController を継承して子クラスに回転関連のふたつのメソッドを追加する部分について、少し工夫しました。

UIViewController+AppViewControllerCategoryを作成してふたつのメソッドをカテゴリで追加してみたところ、iOS6では動作しました。全UIViewController に同じ動作のメソッドを追加できるので便利かなと思います。

横画面固定のゲーム画面のViewControllerがある場合は、オーバーライドで個別に対応可能できるかと思います(未確認)
Posted by StewEucen at 2013年05月27日 15:47
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
Apple、Appleのロゴ、App Store、iPodのロゴ、iTunesは、米国および他国のApple Inc.の登録商標です。
iPhone、iPod touch、iPadはApple Inc.の商標です。
iPhone商標は、アイホン株式会社のライセンスに基づき使用されています。
その他、本ブログに記載されている製品名、会社名は、それぞれ各社の商標または登録商標です。