1

横向きのみをサポートする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常にモードで表示されていたことが原因であることがわかりました。PortraitLandscape

私がそれを解決しようとした方法:

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を介してインストールすることにより、デバイスでテストすることを提案しました。

それは素晴らしいですが、私の問題はまだ存在しています

誰かがこの問題を解決する方法を知っていますか?

4

1 に答える 1

0
  1. info.plist で、すべての向きをサポート対象として宣言します。

  2. method はもう必要ないapplication:supportedInterfaceOrientationsForWindow:ので、削除できます。

  3. サブクラスのルート ビュー コントローラー

次のメソッドを追加します。

- (BOOL)shouldAutorotate {
    return YES;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) {
        return self.interfaceOrientation;
    } else {
        return UIInterfaceOrientationLandscapeRight;
    }
}

モーダル ビュー コントローラーを提示し、回転させたくない場合は、このコードをルート コントローラーにも追加する必要があります。

于 2013-01-15T16:50:57.487 に答える