横向きのみをサポートするiPadアプリを作成しています。そのアプリでは、次のコードを使用してフォトライブラリを呼び出しています。
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.sourceType =
UIImagePickerControllerSourceTypePhotoLibrary;
imagePicker.mediaTypes = [NSArray arrayWithObjects: (NSString *) kUTTypeImage, nil];
self.iPadPopoverController = [[UIPopoverController alloc] initWithContentViewController:imagePicker];
[self.iPadPopoverController setDelegate:self];
[self.iPadPopoverController presentPopoverFromRect:CGRectMake(490, 638, 44, 44) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
ただし、これにより、次の例外を除いてクラッシュが発生します。
Uncaught exception: Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES
クラッシュの理由:
調査したところ、インターフェイスの向きがである場合でも、クラッシュはUIImagePickerController
常にモードで表示されていたことが原因であることがわかりました。Portrait
Landscape
私がそれを解決しようとした方法:
iOS6リリースノートと以前に投稿されたいくつかの質問を読んだ後 ; クラッシュの原因となった方法は、アプリケーションデリゲートにあることがわかりました。
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
明らかな解決策は、それを返すことでしたUIInterfaceOrientationMaskLandscape|UIInterfaceOrientationMaskPortrait
Landscape
ただし、アプリでのみサポートしたいです。Boolean
したがって、私の最初の解決策は、App Delegateにフラグを追加し、YES
を呼び出す直前にフラグを設定し、それを閉じた後にUIImagePickerController
元に戻すNO
ことでした。
そしてそれはうまくいきました、しかし私はそれに満足していませんでした、それは厄介な解決策のように感じました。その代わりに、呼び出し元のメソッドチェックを行い、それが初期化する関数であるUIImagePickerController
場合、メソッドはを返しUIInterfaceOrientationMaskPortrait
ます。
-(BOOL) iPadPopoverCallerFoundInStackSymbols{
NSArray *stackSymbols = [NSThread callStackSymbols];
for (NSString *sourceString in stackSymbols) {
if ([sourceString rangeOfString:@"[UIViewController(PhotoImport) importPhotoFromAlbum]"].location == NSNotFound) {
continue;
}else{
return YES;
}
}
return NO;
}
そのソリューションは、シミュレーターとデバイスで機能しました。
ここに奇妙な部分があります
私のアプリをストアに送信した後、すべてのユーザーが、フォトライブラリにアクセスするたびにアプリがクラッシュしたと報告していました。クラッシュレポートを調べたところ、上記の例外が原因でクラッシュが発生していることがわかりました。なぜこれが起こっているのか理解できませんでした。
そこで、この問題についてアップルにTSI(テクニカルサポートインシデント)を提出しました。彼らは、アプリがアーカイブされた後、スタックシンボルは人間が読める形式ではないと答えました。そのため、私のチェックは常に失敗します。
彼らはまた、プロジェクトを最初にファイルにアーカイブ.ipa
し、将来このような問題を検出するためにiTunesを介してインストールすることにより、デバイスでテストすることを提案しました。
それは素晴らしいですが、私の問題はまだ存在しています
誰かがこの問題を解決する方法を知っていますか?