私のアプリは、supportedInterfaceOrientation
プロパティを介した横向きのみをサポートしています。
IOS 6より前のiOSを使用すると、UIImagePickerController
自体が縦向きのみをサポートしている場合でも、アプリはpresentViewController:animated:completion:
を介してUIImagePickerController
のインスタンスを正常にロードできます。
画像ピッカーは、ユーザーに横向きで表示されます。ユーザーは携帯電話を回転させ、画像を選択してから、回転して横向きに戻しました。
IOS 6.0では、UIImagePickerController
インスタンスでpresentViewController:animated:completion:
を呼び出すとアプリがクラッシュします。 supportedInterfaceOrientation
プロパティにポートレートオプションを追加することで、クラッシュを防ぐことができます。
ただし、ポートレートで操作することは、実際には私のアプリにとって意味がありません。 shouldAutorotateToInterfaceOrientation
を使用して、アプリが「ポートレートをサポート」できるようにすると考えていましたが、この1つのビューではポートレートにしか回転できません。しかし、今ではそのメソッドは非推奨であり、shouldAutorotateで同じ手法を使用することはできません。
IOS 6.0でこの問題を回避する方法はありますか?
IOS 6.1以降、これはもう発生しません、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
をサブクラス化するべきではないことを強調することはできません。受け入れられている解決策があなたにそう主張しているからです。
ここで重要なことは、「このクラスはそのまま使用することを意図しており、サブクラス化をサポートしていません。」です。
私の場合、これをアプリケーションのデリゲートに追加しました(横向きのみのアプリを持っています)。これは、ポートレートがサポートされているため、画像ピッカーに表示できることを伝えます。
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
return UIInterfaceOrientationMaskAll;
}
そして、たまたまUINavigationController
であったView Controllerに、次のカテゴリを含めました。
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscape;
}
これで私のアプリは回転せず、画像ピッカーはデリゲートにポートレートとして表示できるかどうかを尋ね、それは大丈夫だと伝えられます。したがって、すべてがうまく機能します。
同様の問題がありましたが、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];
これで問題は解決しました。状況は少し異なりますが、根本的に同じエラーのように聞こえます。
UIImagePickerControllerのサブクラス化は機能しますが、カテゴリの方が優れたソリューションです。
@implementation UIImagePickerController (NonRotating)
- (BOOL)shouldAutorotate
{
return NO;
}
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationPortrait;
}
@end
IOS 7.1からのレポート:
上記の回答で指定されていることに加えて、info.plistでポートレートモードを完全に有効にする必要があるようです。
これがなければ、上記のコード/修正はどれもうまくいきませんでした。
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscape;
}
問題を修正しますが、iOs7から