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


103

このエラーは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でのみ発生します。

誰か手がかりはありますか?


3
私は同じ問題を抱えています。iOS7では、UIIMagePickerControllerが機能しなくなりました。
condor304 2013

このメソッドを呼び出すとうまくいきました。ビューを提示した後に配置します。[yourViewBeingPresented.view layoutIfNeeded];
ボビー

回答:


32

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];
}

1
これはこれまでのところうまくいくようです、私は問題なく次々に10枚の写真を撮ることによってそれをテストしました。
DevC

3
presentModalViewControllerはiOS 6で廃止されました。presentViewControllerを今すぐ使用することをお勧めします。
ガリーモン2014年

5
iOS8でも同じ問題と修正。
Yauheni Shauchenka 2014

1
私はUIAertControlからこれを機能させようとしています-1つのオプションは写真ブラウザの画像ピッカーを表示することです-これはうまく機能し、もう1つはカメラに表示することです-これは機能しません。 UIALertController?
SimonTheDiver

3
カメラをviewDidAppear / Loadで初期化しません。私はテーブルビューを持っていて、テーブルビューの選択の1つに応じてカメラを起動します。そして、私はこのエラーメッセージを受け取ります。何か案は?
2015

18

このエラーは、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にバグレポートを提出しました。

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


1
アップルはあなたにどのように答えましたか?私は同じ問題を抱えており、stackoverflowのソリューションが機能しません。
heekyu 2014

これについてはまだAppleから聞いたことがありません。返事があれば返信します。
スコットカーター

アップルからのニュースは?@ScottCarter
Benjamin Toueg 2014

1
もう一度チェックしました。それは11月2日、2013年に出願されたので、開いているバグのアクションはありません
スコット・カーター

これは、bugreport.apple.comのバグ15377241です
スコットカーター、

11

ポップオーバーの内側にカメラビューを表示しようとすると、問題が発生しました。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.

同じように。

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


3
cameraUI.modalPresentationStyle = UIModalPresentationFullScreen; 私のために働く。ここで成功しているのはそれだけです。ありがとう!
daveMac、2014

2
最後に!私はこの問題を何度も経験しており、良い解決策を見つけることができませんでした。質問スレッドをこれ以上見下ろさないようにしてください。imagePicker.modalPresentationStyle = UIModalPresentationFullScreen; 私のためにこれを解決しました。これは受け入れられる答えである必要があります:)
woobione

6

プロパティを作成する

@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];

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


3
picker.modalPresentationStyle = UIModalPresentationCurrentContext; 私にとって違いがありました。
Berna氏

1
ピッカーが初めて表示されたときに機能しますが、その後警告が返されます。
daveMac、2014

picker.modalPresentationStyle = UIModalPresentationCurrentContextを確認します。私のために解きのiOS 8で間違ったレイアウトの問題
ジョアン・ヌネス

私には機能しません-iOS 8.1.3のUIButtonアクションにこれを追加しました
Andy

これは有望であるように見えましたが、スナップショットの問題については私には何もせず、写真が撮られた後、画像の一部の周りに役に立たないフレームを表示しました。
抽選。

4

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

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];
}

1
アイデアは理論的には機能しますが、残念ながら、表示されているコントロールは機能しないか、正しく表示されません。
daveMac、2014

そして、それは警告を取り除きませんでした(少なくとも私にとっては)
Ege Akpinar 2014年

3

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

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

この問題を解決する方法:

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

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

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

この手順の後、UIImagePickerControllerは正しく機能しますが、ビューコントローラーを縦向きモードに回転できます。したがって、これを解決するには:

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

@implementation UINavigationController (RotationIOS6)

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

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


1
OPで説明されているエラーが発生するポートレートモードアプリを修正しています。したがって、あなたの解決策は普遍的に適用可能ではないようです。
JohnK 2013

main.mにtry-catchブロックを追加して、例外とスタックトレースを出力しようとしましたか?
ローマエルモロフ2013

同様に、この
JohnK 2013

@JohnKうん、こんな感じ。
ローマエルモロフ2013

3

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

- (BOOL)shouldAutorotate {
    return YES;
}

3

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];
    }

}    

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


1

これを試して、使用してください

[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

これは私のアプリ、ymmvで修正されたものです

まず、iPhone-iPadアプリです。

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

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

お役に立てれば。


0

同じ問題が発生しました。私の場合の問題は、ARC以外のコードがあり、それをARCに移行したことです。移行を行ったとき、への強い言及はありませんでしたUIImagePickerController。それがクラッシュの原因でした。

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


0

iOS 8でも同じ問題が発生しましたが、[設定]-> [アプリのプライバシー]でカメラアクセスが無効になりました。ちょうどそれを有効にし、それは働いていました。


0

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

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

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

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


0

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

だから、私はそれUIImagePickerViewControllerがこの回答に示されているようにステータスバーを非表示にして解決しました。


-1

あなたの質問に直接答えることはありませんが、あなたはあなたがメモリ警告があったと述べました、あなたはメモリ警告につながる可能性があるプロパティに生の画像を保存しているかもしれません。これは、RAW画像が約30MBのメモリを消費するためです。iPhone 4シリーズにあるiOS6のアプリをテストすると、同様のメモリ警告に気づきました。デバイスがiOS7にアップグレードされたとき、私はまだこの警告を受けました。iOS7のiPhone 5シリーズでテストするときにメモリ警告はありません。


-5

変化

[self presentViewController:imagePicker animated:YES completion:nil];

[self presentViewController:imagePicker animated:YES completion:NULL];

私のために問題を修正しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.