shouldAutorotateToInterfaceOrientation:はdeprecatedだよ!

iOS 6以前の「ねむスタ」ではこんな感じで各タブのビューを回転させるかさせないかを決めていた。


MyTabBarController.m

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
	if (self.tabBarController.selectedIndex==1) {
		return YES;
	}
	return NO;
}

仕様としては、左から2番目のタブだけ回転対応で、それ以外は回転しない。
なので、タブの selectedIndex が 1 の時だけ YES を返していた。


ここでは全部の”向き”について YES を返しているけど、回転できる”向き”は Info.plist(Xcode の TARGETS の Summary タブにある Supported Interface Orientations)で設定している値に限定される。
例えば、Info.plist で UpsideDown と LandscapeLeft のチェックを外しておけば、それぞれの方向には回転しなかった。


で、iOS 6 になってどうなったか?
iOS SDK Release Notes for iOS 6 にあるように shouldAutorotateToInterfaceOrientation: は deprecated だよ!
代わりに shouldAutorotate と supportedInterfaceOrientations を使う
こんな感じ。


MyTabBarController.m

- (BOOL)shouldAutorotate {
	if (self.selectedIndex==1) {
		return YES;
	}
	return NO;
}

- (NSUInteger)supportedInterfaceOrientations {
	return UIInterfaceOrientationMaskAll;
}

まず、shouldAutorotate で回転しますか?って確認される。
その際に、回転して良いタブが選択されていたら(selectedIndex==1)、YES を返す。それ以外のタブなら NO を返す。
で、回転して良い場合、どの方向に回転していいのかを supportedInterfaceOrientations で確認されるので UIInterfaceOrientationMask の値を使って返す。
この例では UIInterfaceOrientationMaskAll を返して全部の方向を許可しているけど、結局 Info.plist の値で制限されるので、先ほどの例のように設定しておけば UpsideDown と LandscapeLeft では回転しなくなる。


もし、iOS 6 で shouldAutorotateToInterfaceOrientation: しかオーバーライドされていない場合はどうなるのか?
この例では Info.plist の設定通りに回転する。
shouldAutorotateToInterfaceOrientation: が呼ばれることはないので、タブ毎の設定は一切なし。


というわけで、「ねむスタ」では全てのタブで回転するようになっちゃっていたのでした。


最後に、画面回転の確認に使ったサンプルを gitHub に置いておいたので、興味のある方はどうぞ。