まいまいワークス

主にiPhoneアプリの開発で考えた事、調べた事、感じた事などを記していきます。

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;

}