viewController単位での回転制御
普段、縦画面固定のアプリを作る事が多いので、縦横対応などが出てくると見事にハマってしまいました。
原因と解決方法などのメモ。
やりたかった事
基本的には縦画面固定だが、一部の画面で縦横対応にしたい
ハマったポイント
-(BOOL)shouldAutorotate;
でNOを返しても画面が回転してしまう
原因
UINavigationControllerなどのコンテナビューでは、子ビューの-(BOOL)shouldAutorotate;
は無視されて、親ビューの設定が反映されてしまう
対策
UINavigationControllerのカテゴリを作成し、子ビューからもshouldAutorotate
を叩けるようにします。
UINavigationController+rotateControl.h
#import <UIKit/UIKit.h> @interface UINavigationController (rotateControl) - (BOOL)shouldAutorotate; - (NSUInteger)supportedInterfaceOrientations; @end
UINavigationController+rotateControl.m
#import "UINavigationController+rotateControl.h" @implementation UINavigationController (rotateControl) - (NSUInteger)supportedInterfaceOrientations { return [self.visibleViewController supportedInterfaceOrientations]; } - (BOOL)shouldAutorotate { return [self.visibleViewController shouldAutorotate]; } @end
これで、コンテナビューの子ビューからも回転制御のメソッドが叩けます。
当該ビューコントローラーで、以下のように記述すれば回転しません。
hogeViewController.m
-(BOOL)shouldAutorotate{ return NO; }
また、回転方向を制御する場合はsupportedInterfaceOrientations
でサポートする方向を返せば良さそうです。
hogeViewController.m
-(BOOL)shouldAutorotate{ return YES; } -(NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskLandscape; }