web-dev-qa-db-ja.com

iOS 6.0でUIImagePickerControllerを表示するとクラッシュする

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

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

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

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

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

IOS 6.0でこの問題を回避する方法はありますか?

41
jenonen

iOS 6.1-修正済み

IOS 6.1以降、これはもう発生しません、iOS 6.0.xでのクラッシュを避けるために、以下の私のヒントに従うことが非常に重要ですまだ適用されます。


iOS 6.0.xの回避策

これは実際にはiOS 6.0のバグであり、今後のiOSリリースで修正される予定です。

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

これは、アプリケーションが横向きのみを必要とするために発生しますが、一部のCocoa Touch View Controllerはエラーである縦向きを厳密に必要とします。

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

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

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

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

ここで、ウィンドウに追加する各View Controllerは、Landscapeにしかできないことを指定する必要があります。詳細については、リンクを確認してください。


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

enter image description here

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


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

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

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

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskLandscape;
}

これで私のアプリは回転せず、画像ピッカーはデリゲートにポートレートとして表示できるかどうかを尋ね、それは大丈夫だと伝えられます。したがって、すべてがうまく機能します。

80
Daniel

同様の問題がありましたが、iPadのランドスケープアプリで発生しました。ポップオーバーで画像ピッカーを紹介していました。 iOS 6でクラッシュしました。エラーは、ピッカーがポートレートを望んでいることを示唆していましたが、アプリはランドスケープビューのみを提供しました。

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

@interface NonRotatingUIImagePickerController : UIImagePickerController

@end

@implementation NonRotatingUIImagePickerController

- (BOOL)shouldAutorotate
{
    return NO;
}

@end

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

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

これで問題は解決しました。状況は少し異なりますが、根本的に同じエラーのように聞こえます。

41
eclux

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

    @implementation UIImagePickerController (NonRotating)

    - (BOOL)shouldAutorotate
    {
        return NO;
    }

    -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
    {
        return UIInterfaceOrientationPortrait;
    }

    @end
26
JonahGabriel

IOS 7.1からのレポート:

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

これがなければ、上記のコード/修正はどれもうまくいきませんでした。

1
-(NSUInteger)supportedInterfaceOrientations
{
   return UIInterfaceOrientationMaskLandscape;
}

問題を修正しますが、iOs7から

1
ANIL.MUNDURU