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 に置いておいたので、興味のある方はどうぞ。