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にのみ存在します。
誰にも手がかりがありますか?前もって感謝します。
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];
}
このエラーは、AppleのPhotoPickerサンプルコードプロジェクトでも表示されました。
IPhone 4でXcodeバージョン5.0とiOS 7.0.3を使用していました。
再現手順:
AppleのPhotoPickerサンプルプロジェクトを https://developer.Apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html からダウンロードします。
APLViewController.mで125行目をコメントアウトします。
//imagePickerController.showsCameraControls = NO;
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;
アプリをビルドして起動します。
起動したら、デバイスを横向きモードに回転させます。
[カメラ]アイコンをクリックして、UIImagePickerControllerをカメラモードで開きます。
コンソール出力を表示します。
コンソール出力
PhotoPicker [240:60b]レンダリングされていないビューのスナップショットを作成すると、空のスナップショットが作成されます。スナップショットを作成する前、または画面更新後のスナップショットの前に、ビューが少なくとも1回はレンダリングされていることを確認してください。
showsCameraControlsプロパティ
この値がYES(デフォルト)の場合、問題が発生します。
これをNOに設定すると、メッセージは削除されました。
バグレポート
Appleにバグレポートを提出しました。
さまざまな投稿で行われた提案の多くを試しましたが、満足のいく回避策は見つかりませんでした。
ポップオーバー内でカメラビューを表示しようとしたときに問題が発生しました。 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
が呼び出されるたびにポップオーバーまたはビューコントローラーを閉じる必要があります。
プロパティを作成する
@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];
これで問題が解決するはずです
このコードを使用して問題を回避しました。
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];
}
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];
}
}
その後、エラーが消え、アプリが動作します!
IOS SDK 6.1でアプリをビルドし、展開ターゲットiOS 6.1でiOS 7搭載iPhoneでアプリを実行すると、このエラーが発生します。アプリはクラッシュしませんが、UIViewController shouldAutorotate
メソッドを実装するとエラーメッセージを削除できます。
- (BOOL)shouldAutorotate {
return YES;
}
私は同じ問題を抱えており、解決策を見つけました。そのエラーは、アプリケーションの向きに関連していると思います。私のアプリケーションは横長モードのみを使用しますが、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で正常に動作します。お役に立てれば。
これを試して、使用
[self performSelector:@selector(presentCameraView) withObject:nil afterDelay:1.0f];
と機能
-(void)presentCameraView{
[self presentViewController:imagePicker animated:YES completion:nil];
}
交換する。 [self presentModalViewController:imagePicker animated:YES];
および原因により、imagePicker
がグローバル変数として作成されます。
これが私のアプリで私のためにそれを修正したものです、ymmv
まずはiPhone-iPadアプリです
appname-Info.plistにあります。サポートされているインターフェイスの向き(iPad)では4つの向きが示されました。
サポートされているインターフェイスの向きでは、3つの向きが示されました。 4番目を追加してアプリを実行しましたが、デバッグ出力はありません。
お役に立てれば。
私は長い時間をかけて解決策を見つけようとしましたが、驚くべきことに、最後にそれを見つけました。
選択した画像を取得して作業を再開するには、次のようにします。
-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
UIImage* pickedImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
[composeImageView setImage:pickedImage];
[picker dismissViewControllerAnimated:YES completion:nil];
}
はい、問題を解決するために、次のメッセージのようにピッカーを通常どおりに閉じる必要があります。「レンダリングされていないビューをスナップショットすると、空のスナップショットが作成されます。画面の更新。」ピッカーの応答を停止しますが、ピッカーを閉じて通常どおり画像を取得できます。
私はちょうど同じ問題に遭遇しました。私の場合、問題はいくつかの非ARCコードがあり、それをARCに移行したことでした。移行を行ったとき、UIImagePickerController
への強い参照を保持していなかったため、クラッシュの原因になりました。
それが役に立てば幸い :)
私の場合、レイアウトの変更に関連していました。UIImagePickerViewController
を表示するVCのステータスバーは非表示になっていますが、UIImagePickerViewController
には表示されていません。
そこで、この answer に示されているように、UIImagePickerViewController
のステータスバーが非表示になるのを解決しました。
IOS 8でも同じ問題が発生しましたが、カメラのアクセスが内部で無効になりました設定->プライバシー私のアプリ。有効にしただけで、機能していました。