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。
重现步骤:
-
在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;
-
构build和启动应用程序。
-
一旦启动,将设备旋转到风景模式。
-
单击“相机”图标可以在相机模式下打开UIImagePickerController。
-
查看控制台输出。
控制台输出
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];
为我解决了这个问题。