web-dev-qa-db-ja.com

iOS6の回転の問題-提示されたモーダルビューコントローラーからの回転がありません

水平方向に反転して、新しいビュー(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

16
ryryan

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

IOS 6では自動回転が変更されています。iOS6では、UIViewControllerのshouldAutorotateToInterfaceOrientation:メソッドは非推奨になりました。代わりに、supportedInterfaceOrientationsForWindow:およびshouldAutorotateメソッドを使用する必要があります。

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAllButUpsideDown;    
}

モーダルViewControllersはiOS6で回転呼び出しを取得しなくなりました:willRotateToInterfaceOrientation:duration:,willAnimateRotationToInterfaceOrientation:duration:,およびdidRotateFromInterfaceOrientation:メソッドは、それ自体でフルスクリーンプレゼンテーションを行うViewControllerで呼び出されなくなりました。 presentViewController:animated:completion:で呼び出されます。

モーダルビューコントローラーを表示するビューコントローラーに回転を通知させることができます。また、presentViewController:animated:completion:を使用してViewControllerを表示します。 presentModalViewController:animated:は非推奨であり、コードで使用します。

26

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

サブクラス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メソッドを削除することを忘れないでください。完全に新しいオリエンテーションモデルに移行しました。それらを残したいのなら、おそらくそれは難しいでしょう。

3
Denis Kutlubaev

このコードをサブクラスUITabBarController.mに追加します

@implementation UINavigationController (rotation)
//temp hack for iOS6, this allows passing supportedInterfaceOrientations to child viewcontrollers.
- (NSUInteger)supportedInterfaceOrientations {
    return [self.topViewController supportedInterfaceOrientations];
}
@end

@implementation NameClassUITabBar

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscape;
}

@end

ここに、回転を使用してタブバーコントローラーにソリューション/エクスペリエンスを投稿しました: http://luterr.blogspot.sg/2015/04/example-code-uiinterfaceorientationmask.html

0
Luter Rinding

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];
 } 

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

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


- (BOOL)shouldAutorotate
{
return YES;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
   return UIInterfaceOrientationLandscapeLeft;
}
0
Alok SInha