2014年1月26日日曜日

UINavigationControllerとUIViewControllerで画面固定

こんにちは, 今回は最近はまったUINavigationControllerとUIViewController, English UIViewControllerのOrientationの固定方法はいろいろなところで述べられています が, ここにUINavigationControllerをはさむといろいろおこります. Storyboardやxibを使っている場合は特に問題ないはずですが, コードでガリガリUIを書いている場合は, こういった問題があります オリジナルはこちら(English) 早速いきましょう

ViewController画面固定

この例では, portraitにしています
@interface FixOrientationViewController ()
 
@end
 
@implementation FixOrientationViewController
 
- (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.
    [self.view setBackgroundColor:[UIColor whiteColor]];
}
 
#pragma mark - Orientation
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {  // iOS5
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
 
-(BOOL) shouldAutorotate {
    return YES;
}
 
- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}
 
-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}
@end
#pragma mark 以下の部分がキーです. その部分からが, portraitのfixコードです これを通常のコードで呼び出すと, 特に問題なく画面が固定されます

問題のあるコード

UINavigationContrllerを入れます
FixOrientationViewController *controller = [[FixOrientationViewController alloc] init];
[controller setTitle:@"Bee"];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:controller];
[self presentViewController:nav animated:YES completion:nil];  // FixOrientationViewController setting doesn't work
そうすると, UINavigationContrllerが加わるのと同時に, 中に存在するはずのFixOrientationViewControllerが画面固定されなくなります

対処法

UINavigationControllerをextendsしてportrait固定のUINavigationControllerをつくってしまおうというのがアイディアです
@interface FixNavViewController ()
@end
 
@implementation FixNavViewController
 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}
 
#pragma mark - Orientation
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // iOS5
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
 
-(BOOL) shouldAutorotate {
    return YES;
}
 
- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}
 
-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}
あらためてこれを使ってコードを書きます
FixOrientationViewController *controller = [[FixOrientationViewController alloc] init];
[controller setTitle:@"Bee"];
FixNavViewController *nav = [[FixNavViewController alloc] initWithRootViewController:controller];
[self presentViewController:nav animated:YES completion:nil];

0 件のコメント:

コメントを投稿