web-dev-qa-db-ja.com

ランドスケープのみのアプリでのGameCenter認証はUIApplicationInvalidInterfaceOrientationをスローします

問題:ユーザーがGameCenterアカウントにログインしていない場合-GameCenter認証ビューがポートレートモードで起動され(iOS 5ではモーダルダイアログがありました)、ログインを求められます。ただし、xcode(プロジェクトの概要)またはsupportedInterfaceOrientationsForWindowでポートレートモードを無効にすると: (私のアプリはランドスケープモードでのみ実行されることになっているため)次のようになります。

キャッチされない例外によるアプリの終了 'UIApplicationInvalidInterfaceOrientation'、理由: 'サポートされている方向にはアプリケーションとの共通の方向がなく、shouldAutorotateはYESを返します'

Portrait for ipad/iphoneを有効にした場合(および/またはsupportedInterfaceOrientationsForWindow :)をコメントアウトした場合、クラッシュすることなく機能しますが、Portraitモードを有効にしたくありません。

23
Tertium

この質問を書いてコードを試しているうちに、解決策を見つけたようです。プロジェクトの概要ですべての方向を有効にし、application:supportedInterfaceOrientationsForWindowを削除します。

このコードをViewControllerに追加します。

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

今ではシームレスに動作します。

27
Tertium

アプリデリゲートに追加:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)w {

return (NSUInteger)[application supportedInterfaceOrientationsForWindow:w] | (1<<UIInterfaceOrientationPortrait);

}
6
Derek Trauger

私の場合、問題はGameCenterから発生していることがわかりました。シミュレーターでゲームセンターをまだ初期化していない場合、ログインビューをポップアップしたいのですが、ポートレートモードです。このポイントに達すると、縦向きを許可しないとクラッシュします。 Game Centerは、ランドスケープユーザーインターフェイスの意図に沿った方向にのみ許可された方向をとる必要があるため、OSの奇妙なバグ。

私はまだ解決策を持っていませんが、見つけたら投稿します。

1
Endre Olah

私はあなたと同じ問題を抱えていて、ちょっと醜い回避策でそれを修正しました。基本的に、有効なインターフェイスの向きを選択するために使用するグローバル変数がアプリにあります。の中に

    - (NSInteger)application : (UIApplication *)supportedInterfaceOrientationsForWindow:(UIWindow *)window{
          if(orientationIndicator == 1){
               return UIInterfaceOrientationMaskAllButUpsideDown;
          }
          else if(orientationIndicator == 2){
               return UIInterfaceOrientationMaskLandscape;
          }
     }

グローバル変数を宣言するには、これをappDelegate.mファイルに入れます。

          int orientationIndicator = 1;

グローバル変数をインポートするには、次を使用します。

          extern int orientationIndicator;

次に、方向インジケーターの値を変更すると、さまざまなインターフェイスタイプで実行できるようになります。つまり、orientationIndicator = 1にすることから始めました。プレーヤーを認証し、ログインビューコントローラーを開始するときに、方向インジケーターを2に設定します。ビューを閉じる(プレーヤーを認証する)と、1に戻すことができます。 。

これはぬるぬるした回避策ですが、私にとってはうまくいきました。

お役に立てれば!

0

例外をキャッチすることは私にとってはうまく機能しているようです:

@try {
    [rootNavigationController pushViewController:viewController animated:YES];
}
@catch (NSException *exception) {
    //somehow, catching this exception just allows the view controller to be shown?
}

IOS 6.0では、例外がスローされますが、それをキャッチすると、viewControllerは引き続き表示され、GameCenterは横向きで期待どおりに動作します。

別の解決策は、iOS 6.1以降をターゲットにすることです。これは、Appleがそのリリースでバグを修正したためです。

0
Jakooistra