web-dev-qa-db-ja.com

UINavigationController ForceRotate

私のアプリケーションは主に縦向きですが、横向きが必要なビューが1つあります。

私のビューはUINavigationController内に含まれていますが、これが(明らかに)この問題の原因です。

1つを除くすべてのUIViewControllerには次のものがあります。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

ランドスケープを必要とするUIViewControllerには次のものがあります。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

ここで、ユーザーが横向きのUIViewControllerに到達すると、縦向きで表示されます。その後、ユーザーは自分の電話を回転させることができ、私が望むように横向きに表示されます(横向きにロック)。次に、ユーザーはポートレートUIViewControllerに進み、同じことが起こります。ランドスケープで開始し、電話を回転させると、再びポートレートになります(そしてポートレートにロックされます)。

UIViewController間で方向のロックが許可されているようですが、自動回転/プログラムによる方向の変更が何らかの理由でブロックされています。

電話を正しい向きに強制的に更新するにはどうすればよいですか?

一時的な解決策があります:デバイスの向きを検出し、正しくない場合はデバイスを回転させるように求めるメッセージを表示できますが、これは最適ではありません。

19
Zac Altman

私のアプリケーションの1つにも同じ要件がありました!!!

幸いなことに、私は解決策を見つけました!

メインのビューコントローラーのランドスケープを維持するために、ポップ/プッシュされた方向に関係なく、次のことを行いました:( viewWillAppear:)

//set statusbar to the desired rotation position
[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO];

//present/dismiss viewcontroller in order to activate rotating.
UIViewController *mVC = [[[UIViewController alloc] init] autorelease];
[self presentModalViewController:mVC animated:NO];
[self dismissModalViewControllerAnimated:NO];

P.S. SDK 3.2.5 ios5.0.1でテスト済み。

P.S. iOS 8では、以前の回答の結果、画面がちらつき、安定していません(場合によっては、機能しなくなりました)。そこで、必要に応じて、コードを次のように変更しました。(ARC)

//set statusbar to the desired rotation position
[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO];

[self.navigationController presentViewController:[UIViewController new] animated:NO completion:^{
    dispatch_after(0, dispatch_get_main_queue(), ^{
        [self.navigationController dismissViewControllerAnimated:NO completion:nil];
    });
}];

//I added this code in viewDidDissapear on viewController class, which will be popped back.

うまくいけば、それが役立つでしょう!

26

これは役立つかもしれません。必要に応じて、表示時に次のメソッドを呼び出すことができます。例えば-viewWillAppear:animated

attemptRotationToDeviceOrientationすべてのウィンドウをデバイスの方向に回転させようとします。

+ (void)attemptRotationToDeviceOrientation

討論

一部のビューコントローラーは、アプリ固有の条件を使用して、shouldAutorotateToInterfaceOrientation:メソッドの実装の戻り値を決定したい場合があります。ビューコントローラーがこれを行う場合、これらの条件が変更されたときに、アプリはこのクラスメソッドを呼び出す必要があります。システムはすぐに新しい方向に回転しようとします。回転は、関連する各ビューコントローラがshouldAutorotateToInterfaceOrientation:メソッドの実装でYESを返す限り発生します。

可用性

IOS5.0以降で利用できます。 http://developer.Apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIViewController_Class/Reference/Reference.html

19
Canopus

これを使って、

[[UIDevice currentDevice]performSelector:@selector(setOrientation:) withObject:(__bridge id)((void *)UIInterfaceOrientationLandscapeRight)];
4
Thangavel