web-dev-qa-db-ja.com

UIImagePickerControllerエラー:レンダリングされていないビューのスナップショットを作成すると、iOS 7でスナップショットが空になります

IOS 7でのみこのエラーが発生し、アプリケーションがクラッシュしました。 iOS 6では、カメラを開くときに一度だけメモリ警告が表示され、エラーは発生しません。

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

これが私がやっていることです。

imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setDelegate:self];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker setAllowsEditing:YES];

[self presentModalViewController:imagePicker animated:YES];

PresentModalViewControllerを遅延させようとしましたが、まだ同じメッセージが表示されます。数秒後(7-10)、アプリケーションがクラッシュしました。

このエラーはiOS 7にのみ存在します。

誰にも手がかりがありますか?前もって感謝します。

103
Didats Triadi

IOS7の問題は遷移に関係しています。以前の移行が完了しておらず、新しい移行を開始した場合、iOS7はビューを台無しにし、iOS6はそれを正しく管理しているようです。

ビューが読み込まれ、タイムアウトが発生した後にのみ、UIViewControllerでカメラを初期化する必要があります。

- (void)viewDidAppear:(BOOL)animated 
{
    [super viewDidAppear:animated];
    //show camera...
    if (!hasLoadedCamera)
        [self performSelector:@selector(showcamera) withObject:nil afterDelay:0.3];
}

ここに初期化コードがあります

- (void)showcamera {
    imagePicker = [[UIImagePickerController alloc] init];
    [imagePicker setDelegate:self];
    [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
    [imagePicker setAllowsEditing:YES];

    [self presentModalViewController:imagePicker animated:YES];
}
32
Lefteris

このエラーは、AppleのPhotoPickerサンプルコードプロジェクトでも表示されました。

IPhone 4でXcodeバージョン5.0とiOS 7.0.3を使用していました。

再現手順:

  1. AppleのPhotoPickerサンプルプロジェクトを https://developer.Apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html からダウンロードします。

  2. APLViewController.mで125行目をコメントアウトします。

    //imagePickerController.showsCameraControls = NO;

  3. APLViewController.mで130〜133行目をコメントアウトします。

    //[[NSBundle mainBundle] loadNibNamed:@"OverlayView" owner:self options:nil];
    // self.overlayView.frame = imagePickerController.cameraOverlayView.frame;
    // imagePickerController.cameraOverlayView = self.overlayView;
    // self.overlayView = nil;

  4. アプリをビルドして起動します。

  5. 起動したら、デバイスを横向きモードに回転させます。

  6. [カメラ]アイコンをクリックして、UIImagePickerControllerをカメラモードで開きます。

  7. コンソール出力を表示します。

コンソール出力

PhotoPicker [240:60b]レンダリングされていないビューのスナップショットを作成すると、空のスナップショットが作成されます。スナップショットを作成する前、または画面更新後のスナップショットの前に、ビューが少なくとも1回はレンダリングされていることを確認してください。

showsCameraControlsプロパティ

この値がYES(デフォルト)の場合、問題が発生します。

これをNOに設定すると、メッセージは削除されました。

バグレポート

Appleにバグレポートを提出しました。

さまざまな投稿で行われた提案の多くを試しましたが、満足のいく回避策は見つかりませんでした。

18
Scott Carter

ポップオーバー内でカメラビューを表示しようとしたときに問題が発生しました。 iOS6ではこれは問題ありませんでしたが、iOS7ではメッセージが表示されました

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

同じように。

ただし、 Taking Pictures and Movies、iOS Developer Library で説明されているようにカメラビューのプレゼンテーションをフルスクリーンに変更した後、すべてが再び正常になり、メッセージが再び表示されることはありませんでした。ただし、アプリがどのモードであるか(つまり、カメラビューまたはフォトロールの表示)に応じて、メソッド- (void) imagePickerControllerDidCancel: (UIImagePickerController *) pickerが呼び出されるたびにポップオーバーまたはビューコントローラーを閉じる必要があります。

11
Arne

プロパティを作成する

@property (nonatomic) UIImagePickerController *imagePickerController;

それから

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.modalPresentationStyle = UIModalPresentationCurrentContext;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing = YES;
self.imagePickerController = picker;
[self presentViewController:self.imagePickerController animated:YES completion:nil];

これで問題が解決するはずです

6
Asfanur

このコードを使用して問題を回避しました。

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker setDelegate:self];

if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
    [imagePicker setShowsCameraControls:NO];
    [self presentViewController:imagePicker animated:YES completion:^{
        [imagePicker setShowsCameraControls:YES];
    }];
} else {
    [imagePicker setShowsCameraControls:YES];
    [self presentModalViewController:imagePicker animated:YES];
}
4

Avirary SDK に付属するデモアプリを変更しようとしたときに同じ問題が発生しました。デモアプリでは、カメラロールから選択した写真しか編集できません。カメラからキャプチャして写真を編集するために、最初にUIViewcontroller.mファイルに次のコードを追加しました。

#pragma mark - Take Picture from Camera
- (void)showCamera
{
//[self launchPhotoEditorWithImage:sampleImage highResolutionImage:nil];

    if ([self hasValidAPIKey]) {
        UIImagePickerController * imagePicker = [UIImagePickerController new];
        [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
        [imagePicker setDelegate:self];
        [imagePicker setAllowsEditing:YES]; //important, must have

        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
            [self presentViewController:imagePicker animated:YES completion:nil];
        }else{
            [self presentViewControllerInPopover:imagePicker];
        }
    }
}

その後、アプリを実行すると、エラーが発生しました:

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

エラーを解決するには、UIViewContooler.mファイルのUIImagePickerデリゲートを次のように変更しました。

#pragma mark - UIImagePicker Delegate

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSURL * assetURL = [info objectForKey:UIImagePickerControllerReferenceURL];

    void(^completion)(void)  = ^(void){

        [[self assetLibrary] assetForURL:assetURL resultBlock:^(ALAsset *asset) {
            if (asset){
                [self launchEditorWithAsset:asset];
            }
        } failureBlock:^(NSError *error) {
            [[[UIAlertView alloc] initWithTitle:@"Error" message:@"Please enable access to your device's photos." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
        }];

        UIImage * editedImage = [info objectForKey:UIImagePickerControllerEditedImage];
        if(editedImage){
            [self launchPhotoEditorWithImage:editedImage highResolutionImage:editedImage];
        }

    };

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        [self dismissViewControllerAnimated:YES completion:completion];
    }else{
        [self dismissPopoverWithCompletion:completion];
    }

}    

その後、エラーが消え、アプリが動作します!

3
Tony

IOS SDK 6.1でアプリをビルドし、展開ターゲットiOS 6.1でiOS 7搭載iPhoneでアプリを実行すると、このエラーが発生します。アプリはクラッシュしませんが、UIViewController shouldAutorotateメソッドを実装するとエラーメッセージを削除できます。

- (BOOL)shouldAutorotate {
    return YES;
}
3
Grigori A.

私は同じ問題を抱えており、解決策を見つけました。そのエラーは、アプリケーションの向きに関連していると思います。私のアプリケーションは横長モードのみを使用しますが、UIImagePickerControllerは縦長モードを使用します。 try.catchブロックをmain.mに追加すると、実際の例外が発生します。

Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES

この問題の解決方法:

1)[ターゲット]-> [一般]または.plistファイルでデバイスの向きを再確認します。サポートされているインターフェイスの向き:左向き、右向き。

2)AppDelegate.mに追加します。

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    return UIInterfaceOrientationMaskLandscape | UIInterfaceOrientationMaskPortrait;
}

このステップの後、UIImagePickerControllerは正常に機能しますが、ビューコントローラーをポートレートモードに回転できます。したがって、これを解決するには:

3)UINavigationControllerのカテゴリを作成します(iOS6でUIViewControllerからUINavigationControllerに移動したsupportedInterfaceOrientations):

@implementation UINavigationController (RotationIOS6)

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

このソリューションは、iOS 6.0、6.1、7.0で正常に動作します。お役に立てれば。

3
Roman Ermolov

これを試して、使用

[self performSelector:@selector(presentCameraView) withObject:nil afterDelay:1.0f];

と機能

-(void)presentCameraView{
    [self presentViewController:imagePicker animated:YES completion:nil];
}

交換する。 [self presentModalViewController:imagePicker animated:YES];および原因により、imagePickerがグローバル変数として作成されます。

1
JerryZhou

これが私のアプリで私のためにそれを修正したものです、ymmv

まずはiPhone-iPadアプリです

appname-Info.plistにあります。サポートされているインターフェイスの向き(iPad)では4つの向きが示されました。

サポートされているインターフェイスの向きでは、3つの向きが示されました。 4番目を追加してアプリを実行しましたが、デバッグ出力はありません。

お役に立てれば。

1
user1045302

私は長い時間をかけて解決策を見つけようとしましたが、驚くべきことに、最後にそれを見つけました。

選択した画像を取得して作業を再開するには、次のようにします。

-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
    UIImage* pickedImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    [composeImageView setImage:pickedImage];
[picker dismissViewControllerAnimated:YES completion:nil];
 }

はい、問題を解決するために、次のメッセージのようにピッカーを通常どおりに閉じる必要があります。「レンダリングされていないビューをスナップショットすると、空のスナップショットが作成されます。画面の更新。」ピッカーの応答を停止しますが、ピッカーを閉じて通常どおり画像を取得できます。

0
DevSherif

私はちょうど同じ問題に遭遇しました。私の場合、問題はいくつかの非ARCコードがあり、それをARCに移行したことでした。移行を行ったとき、UIImagePickerControllerへの強い参照を保持していなかったため、クラッシュの原因になりました。

それが役に立てば幸い :)

0
arturgrigor

私の場合、レイアウトの変更に関連していました。UIImagePickerViewControllerを表示するVCのステータスバーは非表示になっていますが、UIImagePickerViewControllerには表示されていません。

そこで、この answer に示されているように、UIImagePickerViewControllerのステータスバーが非表示になるのを解決しました。

0
kanobius

IOS 8でも同じ問題が発生しましたが、カメラのアクセスが内部で無効になりました設定->プライバシー私のアプリ。有効にしただけで、機能していました。

0
BhushanVU