ナビゲーションコントローラーアプリがあります。最初に FirstViewController (縦方向をサポート) をプッシュし、次に SecondViewController (すべての方向をサポート) をプッシュします。SecondViewController のランドスケープ モードで [戻る] ボタンを押すと、FirstViewController がランドスケープ モードで表示されます。そのため、ナビゲーション ビューを手動で回転させますが、setStatusBarOrientation を Portrait に設定したい場合 (最初のビュー コントローラーは縦モードでのみ表示されます)、View Controller の向きは横のままで、デバイスを縦モードに回転させても、向きは横向きのままです。FirstViewControllerの私のコードは次のとおりです。
- (void)viewWillAppear:(BOOL)animated
{
if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation))
{
if (self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
prevInterfaceOrientation = UIInterfaceOrientationLandscapeLeft;
self.navigationController.view.transform = CGAffineTransformIdentity;
self.navigationController.view.transform =
CGAffineTransformMakeRotation(degreesToRadians(90));
}
else if (self.interfaceOrientation ==
UIInterfaceOrientationLandscapeRight) {
prevInterfaceOrientation = UIInterfaceOrientationLandscapeRight;
self.navigationController.view.transform = CGAffineTransformIdentity;
self.navigationController.view.transform =
CGAffineTransformMakeRotation(degreesToRadians(-90));
}
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO];
[self.tableViewDetail reloadData];
}
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
if (toInterfaceOrientation == UIInterfaceOrientationPortrait)
{
if (prevInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
self.navigationController.view.transform = CGAffineTransformIdentity;
}
else if (prevInterfaceOrientation ==
UIInterfaceOrientationLandscapeRight) {
self.navigationController.view.transform = CGAffineTransformIdentity;
}
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
[self.tableViewDetail reloadData];
}
}
私も使用しようとしました:
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
if (UIInterfaceOrientationIsLandscape(prevInterfaceOrientation))
{
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
}
}
しかし、self.interfaceOrientation は、縦向きに回転しても横向きのままです。しかし、FirstViewController が縦向きのみをサポートしていることをユーザーが確認できるようにするには、手動でビューを縦向きモードに回転させる必要があります。SecondViewController のビューを (モーダル ウィンドウのように) MainWindow に配置するオプションがありますが、Apple に setStatusBarOrientation メソッドがある場合、この問題を正しく解決する必要があるように思われるため、この考えは好きではありません。