16

私は、水平にフリップして新しいビュー (InfoViewController) をプッシュするボタンを持つ MainViewController を持っています。そのようです:

controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:controller animated:YES];

MainView Controller は Portrait と PortraitUpsideDown をサポートしています。そのようです:

- (BOOL)shouldAutorotate {
    return YES;    
}

- (NSUInteger)supportedInterfaceOrientations {    
    return (UIInterfaceOrientationMaskPortrait | 
            UIInterfaceOrientationMaskPortraitUpsideDown);
}

私の InfoViewController には、上記のコードも記載されています。私のAppDelegateでは、LaunchOptionsにこれがあります:

[self.window setRootViewController:self.mainViewController];

私の app.plist ファイルでは、すべての向きをサポートしています。これは、他のビューもランドスケープをサポートする必要があるためです。したがって、MainViewController と InfoViewController では、Portrait と PortraitUpsideDown のみが必要です。しかし、別のビューでは、すべての向きが必要です。

私の MainViewController は正常に動作しますが、InfoViewController はすべての向きで動作します。

これをiOS6で動作させるのは非常に困難です。私は他の投稿を調査し、他の人が提供した支援を試みましたが、まったく運がありませんでした. 誰かが私がこれを達成するのを手伝ってくれてありがとう。そして、私はObjective-Cの初心者です:p

4

4 に答える 4

26

アプリの plist ファイルですべての方向をサポートするのではなく、ルート ビュー コントローラーがサポートする方向のみをサポートします。

自動回転は iOS 6 で変更されています。iOS 6 では、shouldAutorotateToInterfaceOrientation:UIViewController のメソッドは非推奨です。その代わりに、supportedInterfaceOrientationsForWindow:andshouldAutorotateメソッドを使用する必要があります。

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAllButUpsideDown;    
}

モーダル ViewControllers は、iOS 6 で回転呼び出しを取得しなくなりました:willRotateToInterfaceOrientation:duration:, willAnimateRotationToInterfaceOrientation:duration:,および didRotateFromInterfaceOrientation:メソッドは、それ自体で全画面表示を行うビュー コントローラーでは呼び出されなくなりましたpresentViewController:animated:completion:

モーダルView Controllerを提示するView Controllerに回転を通知させることができます。また、次を使用presentViewController:animated:completion:して、View Controller を表示します。presentModalViewController:animated:コードで使用するものは非推奨です。

于 2012-09-23T18:47:14.410 に答える
3

タブバーコントローラーを使用しながら、同様の問題を解決しました。

サブクラスUITabBarController。これらのメソッドを実装します。

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}


- (BOOL)shouldAutorotate
{
    NSLog(@"Orientation:%d", [[UIDevice currentDevice] orientation]);

    for (UIViewController *viewController in self.viewControllers) {
        [viewController shouldAutorotate];
    }

    return YES;
}

tabbarcontroller内のコントローラーで回転を処理する場合は、tab barコントローラー内の各コントローラーでそれらのメソッドも実装し、方向の変更を処理するコードを記述します。それを処理したくない場合は、それらのメソッドを実装する必要はありません。TabBarControllersメソッドは、向きが変わると常に実行されます。理由は不明ですが2回でも。

はい。すべてのshouldAutorotateメソッドを削除することを忘れないでください。完全に新しいオリエンテーションモデルに移行しました。それらを残したいのなら、おそらくそれはもっと難しいでしょう。

于 2012-10-08T00:29:50.110 に答える
0

UINavigationController をサブクラス化してカテゴリを作成し、.h ファイルに次のメソッドを実装します。

-(BOOL)shouldAutorotate;
-(NSUInteger)supportedInterfaceOrientations;
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation;



 in .m file

-(BOOL)shouldAutorotate
{
return [self.topViewController shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
 {
return [self.topViewController supportedInterfaceOrientations];
 }

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
 {
return [self.topViewController preferredInterfaceOrientationForPresentation];
 } 

ビューコントローラークラスに次のメソッドを実装し、回転を有効にしたいクラス

-(NSUInteger)supportedInterfaceOrientations
{
return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft |   UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown);
 }


- (BOOL)shouldAutorotate
{
return YES;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
   return UIInterfaceOrientationLandscapeLeft;
}
于 2014-03-25T05:51:01.723 に答える