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中出现。

任何人都有线索? 先谢谢你。

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

苹果的PhotoPicker示例代码项目也出现了这个错误。

我在iPhone 4上使用Xcode版本5.0和iOS 7.0.3。

重现步骤:

  1. https://developer.apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html下载Apple的PhotoPicker示例项目;

  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. 构build和启动应用程序。

  5. 一旦启动,将设备旋转到风景模式。

  6. 单击“相机”图标可以在相机模式下打开UIImagePickerController。

  7. 查看控制台输出。

控制台输出

PhotoPicker [240:60b]快照尚未渲染的视图会导致空的快照。 确保您的视图在屏幕更新后的快照或快照之前至less已呈现一次。

showsCameraControls属性

当这个值有YES(缺省值)时,问题就发生了。

将其设置为NO消除了该消息。

错误报告

我刚刚向苹果提交了一个错误报告。

我已经尝试了许多在不同职位上提出的build议,但还没有find令人满意的解决方法。

当我试图在popup窗口中显示相机视图时,我遇到了问题。 在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开发者库中描述的一切都很顺利,消息再也没有出现。 然而,我不得不确保,取决于在哪种模式下的应用程序(即呈现相机视图或照片滚动),我不得不closurespopup窗口或视图控制器的方法- (void) imagePickerControllerDidCancel: (UIImagePickerController *) picker被称为。

创build一个属性

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

我有同样的问题,并find解决办法。 我认为,这个错误与您的应用程序的方向有关。 我的应用程序只使用横向模式,但UIImagePickerController使用纵向模式。 我添加try-catch块到main.m,并得到真正的exception:

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

我如何解决这个问题:

1)重新检查目标 – >常规或.plist文件中的设备方向:支持的界面方向:左侧风景,右侧风景。

2)joinAppDelegate.m:

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

在这一步后,UIImagePickerController工作正常,但我的viewcontrollers可以旋转到肖像模式。 所以,要解决这个问题:

3)为UINavigationController创build一个类别(supportedInterfaceOrientations从UIViewController移到iOS6中的UINavigationController):

 @implementation UINavigationController (RotationIOS6) - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; } @end 

此解决scheme在iOS 6.0,6.1,7.0上正常工作。 希望这可以帮助。

使用iOS SDK 6.1构build应用程序时,出现此错误,部署目标iOS 6.1,并在iOS 7的iPhone上运行应用程序。 应用程序不会崩溃,但实现UIViewController shouldAutorotate方法可以帮助我删除错误消息。

 - (BOOL)shouldAutorotate { return 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]; } } 

然后错误消失,应用程序工作!

试试这个,使用

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

和function

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

取代。 [self presentModalViewController:imagePicker animated:YES]; 并使imagePicker成为一个全局variables。

这是我的应用程序,ymmv修复它

首先它是一个iPhone – iPad的应用程序

在appname-Info.plist中。 在支持的界面方向(iPad)显示4个方向。

在支持的接口方向上显示3个方向。 我添加了第四个,运行应用程序,没有debugging输出。

希望这可以帮助。

我刚刚遇到同样的问题。 在我的情况下,问题是我有一些非ARC代码,我已经迁移到ARC。 当我进行迁移时,我没有强烈的引用UIImagePickerController ,这是崩溃的原因。

希望它有助于:)

我有同样的问题在iOS 8中,但相机访问是禁用内设置 – >隐私为我的应用程序。 只是启用它,它正在工作。

我花了很长时间试图find解决办法,而且最终我发现了这个解决scheme,而且一旦我发现它就非常有趣。

这里是你将做什么来检索你select的图像,恢复工作:)

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

是的,要解决这个问题,你只需要closurespicker,因为看起来这个消息是这样的:“快照未渲染的视图会导致一个空的快照。确保你的视图在快照或快照之前至less被渲染一次屏幕更新“。 停止select器响应,但你可以解雇它,并正常检索图像。

在我的情况下,它与布局更改有关:呈现UIImagePickerViewController的VC具有隐藏的状态栏,但UIImagePickerViewController没有。

所以,我解决了它隐藏状态栏在UIImagePickerViewController中显示在这个答案 。

不直接回答你的问题,但你提到你有一个内存警告,你可能会将原始图像存储在一个属性,可能会导致内存警告。 这是因为原始图像占用了大约30MB的内存。 当在iOS 4上testingiPhone 4系列上的应用程序时,我注意到了类似的内存警告。 当设备升级到iOS7时,我仍然收到这个警告。 在iOS7上testingiPhone 5系列时没有内存警告。

更改

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

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

为我解决了这个问题。