41

私のアプリは、プロパティを介して横向きのみをサポートしていsupportedInterfaceOrientationます。

iOS 6より前のiOSを使用すると、アプリ自体が縦向きのみをサポートしている場合でも、アプリはUIImagePickerControllerviaのインスタンスを正常にロードできます。presentViewController:animated:completion:UIImagePickerController

画像ピッカーは、単にユーザーに横向きに表示されます。ユーザーは携帯電話を回転させ、画像を選択してから、回転して横向きに戻しました。

iOS 6.0では、インスタンスを使用して呼び出すpresentViewController:animated:completion:UIImagePickerControllerアプリがクラッシュします。プロパティにポートレートオプションを追加することで、クラッシュを防ぐことができsupportedInterfaceOrientationます。

ただし、ポートレートで操作することは、私のアプリにはまったく意味がありません。shouldAutorotateToInterfaceOrientationアプリが「ポートレートをサポート」できるようにするために使用できると思っていましたが、この1つのビューでのみポートレートに回転できます。しかし、現在そのメソッドは非推奨であり、shouldAutorotateで同じ手法を使用することはできません。

iOS 6.0でこの問題を回避する方法を誰かが知っていますか?

4

5 に答える 5

80

iOS6.1-修正済み

iOS 6.1以降、これは発生しなくなりました。iOS6.0.xでのクラッシュを回避するために、私のヒントに従うことが非常に重要です。以下は引き続き適用されます。


iOS6.0.xの回避策

これは実際にはiOS6.0のバグであり、将来のiOSリリースで修正されるはずです。

Appleのエンジニアがこのバグと回避策をここで説明しています:https ://devforums.apple.com/message/731764

これは、アプリケーションが横向きのみを必要としているが、一部のCocoa Touch View Controllerは厳密に縦向きを必要とするために発生します。これはエラーです。縦向きよりも多くを必要とするのではなく、アプリケーション要件の解釈です。

この例は次のとおりです。

横向きをサポートするiPadアプリは、UIPopoverControllerを介してのみUIImagePickerControllerを表示します。UIImagePickerControllerには縦向きが必要ですが、アプリは横向きのみを強制します。エラーと...クラッシュ

問題があると報告されている他のフレームワークには、GameCenterログインビューコントローラーが含まれます。

回避策は非常に単純ですが、理想的ではありません... info.plist / project情報ペインで宣言された正しい方向を維持しますが、Application Delegateクラスでは、すべての方向を許可することを宣言します。

これで、ウィンドウに追加する各View Controllerは、ランドスケープのみにできることを指定する必要があります。詳細については、リンクを確認してください。


UIImagePickerController受け入れられた解決策があなたにそうするように主張しているので、あなたがどれだけサブクラス化すべきではないかを強調することはできません。

ここに画像の説明を入力してください

ここで重要なのは、「このクラスはそのまま使用することを目的としており、サブクラス化をサポートしていない」ということです。


私の場合、これをアプリケーションのデリゲートに追加しました(私は横向きのみのアプリを持っています)。これは、縦向きがサポートされているため、表示できる画像ピッカーに通知します。

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
    return UIInterfaceOrientationMaskAll;
}

そして、たまたまだった私のView ControllerにUINavigationController、次のカテゴリを含めました。

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskLandscape;
}

これでアプリが回転しなくなり、画像ピッカーが代表者に縦向きで表示できるかどうかを尋ねると、問題ないと言われます。したがって、すべてがうまく機能します。

于 2012-09-25T01:24:18.220 に答える
41

同様の問題が発生しましたが、iPadランドスケープアプリで発生しました。ポップオーバーでイメージピッカーを提示していました。iOS 6でクラッシュしました。エラーは、ピッカーが縦向きを望んでいたことを示していましたが、アプリは横向きのビューしか提供していませんでした。そして...重要なことに...ピッカーのshouldRotateはYESを返していました。

ピッカーを作成しているViewControllerClass.mにこれを追加しました

@interface NonRotatingUIImagePickerController : UIImagePickerController

@end

@implementation NonRotatingUIImagePickerController

- (BOOL)shouldAutorotate
{
    return NO;
}

@end

代わりにそのクラスを使用しました

UIImagePickerController *imagePicker = [[NonRotatingUIImagePickerController alloc] init];
[myPopoverController setContentViewController:imagePicker animated:YES];

それは私にとって問題を解決しました。状況は少し異なりますが、基本的に同じエラーのように聞こえます。

于 2012-09-21T03:39:33.030 に答える
26

UIImagePickerControllerのサブクラス化は機能しますが、カテゴリの方が優れたソリューションです。

    @implementation UIImagePickerController (NonRotating)

    - (BOOL)shouldAutorotate
    {
        return NO;
    }

    -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
    {
        return UIInterfaceOrientationPortrait;
    }

    @end
于 2012-09-24T18:12:12.540 に答える
1

iOS 7.1からのレポート:

上記の回答が指定していることに加えて、info.plistでポートレートモードを絶対に有効にする必要があるようです。

これがなければ、上記のコード/修正のどれも私のために働きませんでした。

于 2014-03-20T09:44:15.367 に答える
1
-(NSUInteger)supportedInterfaceOrientations
{
   return UIInterfaceOrientationMaskLandscape;
}

問題は修正されますが、iOs7から

于 2014-07-01T11:26:25.067 に答える