web-dev-qa-db-ja.com

iOS 6 shouldAutorotate:は呼び出されていません

私はこれを解決するためにインターネットを精査してきましたが、何も見つかりません。 iOS 5アプリとiOS 6の互換性を確保しようとしています。オリエンテーションを正しく機能させることができません。回転が発生する時期を検出できません。私が試しているコードは次のとおりです。

- (BOOL)shouldAutorotate {
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}
// pre-iOS 6 support
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}

新しいsupportedInterfaceOrientation:メソッドが正常に呼び出されます。ただし、shouldAutorotateメソッドは起動しません。回転時に画像を交換する必要がありますが、回転が発生することを示す兆候は得られません。

前もって感謝します。

48
Lizza

アプリの起動時に次のエラーが表示されるかどうかを確認してください。

アプリケーションウィンドウには、アプリケーションの起動時にルートビューコントローラーが必要です。

その場合、それを修正する方法は、AppDelegate.mファイル(これを修正する方法はいくつかありますが)

// Replace
[self.window addSubview:[navigationController view]];  //OLD

// With
[self.window setRootViewController:navigationController];  //NEW

この後、shouldAutoRotateを正しく呼び出す必要があります。

80
user1672376

UINavigationControllerをアプリの基盤として使用する場合、次のサブクラスを使用して、最上位の子ViewControllerが回転を決定できる柔軟性を提供します。

@interface RotationAwareNavigationController : UINavigationController

@end

@implementation RotationAwareNavigationController

-(NSUInteger)supportedInterfaceOrientations {
    UIViewController *top = self.topViewController;
    return top.supportedInterfaceOrientations;
}

-(BOOL)shouldAutorotate {
    UIViewController *top = self.topViewController;
    return [top shouldAutorotate];
}

@end
45
Mike Pollard

その方法は、それを判断する正しい方法ではありません。正しいメソッドはwillRotateToInterfaceOrientation:duration:

(shouldAutorotateとは対照的に)方向に回転するメソッドは非推奨であり、iOS 6からは呼び出されなくなりましたが、使用方法を意図したものではありませんでした。

[〜#〜] edit [〜#〜]繰り返される下票への応答。私が示した方法を使用することが(OPを引用するために)「回転が発生しようとしていることの表示」ではない理由を説明してください。質問の内容とタイトルが一致していません。

15
borrrden

viewControllerviewControllerの子UINavigationControllerである場合、以下を実行できます。

  • サブクラスUINavigationController
  • サブクラスのshouldAutoRotateをオーバーライドします
  • このメソッドが呼び出されたときにtopViewControllerこのメッセージを送信します

//このメソッドはUINavigationControllerサブクラス内にあります

- (BOOL)shouldAutorotate
{
    if([self.topViewController respondsToSelector:@selector(shouldAutorotate)])
    {
        return [self.topViewController shouldAutorotate];
    }
    return NO;
}
  • これで、viewControllersはこのメソッドにそれぞれ応答します。
  • 他のorinetaion-methodsでも同じことができることに注意してください
10
Basheer_CAD

IOS 6では、コンテナナビゲーションコントローラーは回転時に子ビューコントローラーを参照しないようです。

in iOS 6リリースノート

現在、iOSコンテナー(UINavigationControllerなど)は、自動回転する必要があるかどうかを判断するために子を参照しません。デフォルトでは、アプリとView Controllerのサポートされるインターフェイスの向きは、iPadイディオムではUIInterfaceOrientationMaskAllに、iPhoneイディオムではUIInterfaceOrientationMaskAllButUpsideDownに設定されます。

この動作は簡単にテストできます。私がやったのは、同じカスタムView Controllerを使用することです

  1. メインビューコントローラーとしての最初のケース
  2. uIPageViewControllerの子としての2番目のケース

最初のケースでは、shouldAutorotateがアプリケーションのサポートされている方向に一致する場合、カスタムナビゲーションコントローラーでsupportedInterfaceOrientationssupportedInterfaceOrientationsの組み合わせによってすべてが決定されます。

2番目のケースでは、カスタムView ControllerのsupportedInterfaceOrientationsがUIPageViewControllerによって呼び出された場合でも、戻り値は考慮されません。 UIPageViewControllerのサブクラスで2つのメソッドが上書きされた場合に機能します。このクラスはサブクラス化されるべきではないため、その副作用についてはわかりません。

10
Adrian

私はiOS 7を使用していますが、私のケースは他の人に役立つかもしれません。

UITabBarControllerをルートとするディープビューコントローラー階層があります。 shouldAutorotateの呼び出しが保証される唯一の場所は、UITabBarController内です。したがって、UITabBarControllerをサブクラス化し、回転制御ロジックをshouldAutorotateメソッド内に配置するだけです。

1
Donald

また、アプリの起動時に次のエラーが発生しました。

「アプリケーションウィンドウには、アプリケーションの起動時にルートビューコントローラーが必要です」

私はUISplitViewController * splitViewControllerを使用しています

その場合、修正する方法はAppDelegate.mファイルに次の変更を加えることです。

交換

 [self.window addSubview:[splitViewController view]];

[self.window setRootViewController:splitViewController];

この後、shouldAutoRotateが呼び出され、正常に機能しました。

1
Michael Jay

これは私がそれをする方法です

現在の向きを確認する場合は、この行をviewconrtoller.mファイルに追加します

 #define isPortrait [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown

次に、方向を確認したい場所、次のような条件を書き込みます

- (void)viewDidLoad
{

        if(isPortrait)
        {
            //portrait mode....

            NSLog(@"its in IsPotraitMode");
        }
        else
        {
            //landscape mode....
            NSLog(@"its in IsLandscapeMode");
        }
}
0
Sam B

UINavigationControllerをアプリの基盤として使用する場合。 UINavigationControllerのカテゴリを作成し、「UINavigationController + autoRotate」と呼びます。これをUINavigationController + autoRotate.hに追加します。

#import <UIKit/UIKit.h>

@interface UINavigationController (autoRotate)

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

@end

これをUINavigationController + autoRotate.mに配置します。

#import "UINavigationController+autoRotate.h"

@implementation UINavigationController (autoRotate)

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

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

@end
0