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

有人有线索吗?

4

16 回答 16

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];
}
于 2013-10-14T10:04:10.190 回答
18

Apple 的 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. 构建并启动应用程序。

  5. 启动后,将设备旋转到横向模式。

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

  7. 查看控制台输出。

控制台输出

PhotoPicker[240:60b] 对尚未渲染的视图进行快照会导致快照为空。确保在快照或屏幕更新后的快照之前至少渲染一次视图。

显示CameraControls 属性

当它的值为 YES (默认值)时,我会遇到问题。

将此设置为 NO 会消除该消息。

错误报告

我刚刚向 Apple 提交了错误报告。

我尝试了许多在不同帖子中提出的建议,但没有找到令人满意的解决方法。

于 2013-11-02T15:05:48.620 回答
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 开发人员库一切都恢复正常,并且消息再也没有出现。但是,我必须确保根据应用程序所处的模式(即显示相机视图或照片卷),无论何时- (void) imagePickerControllerDidCancel: (UIImagePickerController *) picker调用该方法,我都必须关闭弹出框或视图控制器。

于 2013-10-23T17:53:31.313 回答
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];

这应该可以解决问题

于 2013-12-12T01:41:41.053 回答
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];
}
于 2014-01-26T11:50:11.333 回答
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。希望这可以帮助。

于 2013-09-25T09:21:49.160 回答
3

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

- (BOOL)shouldAutorotate {
    return YES;
}
于 2013-10-14T07:35:48.440 回答
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];
    }

}    

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

于 2014-02-03T04:49:02.660 回答
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作为一个全局变量的原因。

于 2013-09-26T06:30:27.083 回答
1

这就是在我的应用程序 ymmv 上为我解决的问题

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

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

在支持的界面方向中显示了 3 个方向。我添加了第四个并运行了应用程序,没有调试输出。

希望这可以帮助。

于 2013-10-15T05:15:54.480 回答
0

我刚刚遇到了同样的问题。就我而言,问题是我有一些非 ARC 代码,并且我已将其迁移到 ARC。当我进行迁移时,我没有强烈地引用 ,UIImagePickerController这就是崩溃的原因。

希望能帮助到你 :)

于 2014-11-26T11:32:17.353 回答
0

我在 iOS 8 中遇到了同样的问题,但是在设置中禁用了相机访问 - > 我的应用程序的隐私。刚刚启用它,它正在工作。

于 2015-04-10T12:34:40.397 回答
0

我花了很长时间试图找到解决方案,令人惊讶的是我最终找到了它,一旦我发现它就非常有趣。

这是您将执行的操作来检索您选择的图像并恢复工作:)

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

是的,要解决这个问题,您只需要正常关闭选择器,因为看起来这条消息:“对未渲染的视图进行快照会导致空快照。确保您的视图在快照之前或快照之后至少渲染一次屏幕更新。” 停止选择器响应,但您可以将其关闭并正常检索图像。

于 2015-05-06T09:56:19.133 回答
0

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

所以,我解决了它隐藏状态栏的问题,UIImagePickerViewController如本答案所示。

于 2016-04-14T15:49:21.600 回答
-1

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

于 2013-12-10T09:56:12.903 回答
-5

改变

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

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

为我解决了这个问题。

于 2014-04-02T19:45:10.563 回答