在iOS 8中,我有从相机捕捉图像的问题,直到现在我正在使用这段代码

UIImagePickerController *controller=[[UIImagePickerController alloc] init];
controller.videoQuality=UIImagePickerControllerQualityTypeMedium;
controller.delegate=(id)self;
controller.sourceType=UIImagePickerControllerSourceTypeCamera;
[self presentViewController:controller animated:YES completion:nil];

但在iOS 8中,我得到了这个:

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.

我已经尝试了本文提供的解决方案

@property (strong,nonatomic)UIImagePickerController *controller;

_controller=[[UIImagePickerController alloc] init];
_controller.videoQuality=UIImagePickerControllerQualityTypeMedium;
_controller.delegate=(id)self;
_controller.sourceType=UIImagePickerControllerSourceTypeCamera;
_[self presentViewController:controller animated:YES completion:nil];

...
controller.modalPresentationStyle=UIModalPresentationFullScreen;
or
controller.modalPresentationStyle=UIModalPresentationCurrentContext;
...

double delayInSeconds = 0.1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [self presentViewController:controller animated:YES completion:nil];
});

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

[self presentViewController:controller animated:YES completion:^{

}];

任何想法?


当前回答

在呈现视图控制器之前,你可以通过引用视图属性来禁用“快照视图”警告。这样做会导致视图加载,并允许iOS在拍摄快照之前渲染它。

UIAlertController *controller = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
controller.modalPresentationStyle = UIModalPresentationPopover;
controller.popoverPresentationController.barButtonItem = (UIBarButtonItem *)sender;

... setup the UIAlertController ... 

[controller view]; // <--- Add to silence the warning.

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

其他回答

我得到了同样的错误,在控制台怒吼的消息,同时打开相机。

’对一个没有被渲染的视图进行快照会导致一个空快照。确保你的视图在快照之前或屏幕更新后至少渲染过一次。”

对我来说,问题是在信息中的捆绑显示名称。plist文件。它是空的某种方式,我把我的应用程序名称在那里,现在它工作正常。我没有收到任何相机权限警报,因为空的Bundle显示名称。它阻止了视图的呈现。

问题不在于视图,而在于未经许可而呈现视图。你可以检查设置>隐私>相机,如果你的应用程序没有列出,问题可能是一样的。

在呈现视图控制器之前,你可以通过引用视图属性来禁用“快照视图”警告。这样做会导致视图加载,并允许iOS在拍摄快照之前渲染它。

UIAlertController *controller = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
controller.modalPresentationStyle = UIModalPresentationPopover;
controller.popoverPresentationController.barButtonItem = (UIBarButtonItem *)sender;

... setup the UIAlertController ... 

[controller view]; // <--- Add to silence the warning.

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

调用这个方法对我来说很有效。在陈述你的观点之后把它放上去。

[yourViewBeingPresented.view layoutIfNeeded];

这可能是内置ImagePickerController的错误。我的代码可以运行,但在iPhone 6 Plus上偶尔会崩溃。

我已经尝试了其他答案提出的所有解决方案,但都没有运气。问题最终解决后切换到JPSImagePickerController。

或者,考虑使用drawviewherarchyinrect:

迅速:

extension UIImage{

    class func renderUIViewToImage(viewToBeRendered: UIView) -> UIImage
    {
        UIGraphicsBeginImageContextWithOptions(viewToBeRendered.bounds.size, true, 0.0)
        viewToBeRendered.drawViewHierarchyInRect(viewToBeRendered.bounds, afterScreenUpdates: true)
        viewToBeRendered.layer.renderInContext(UIGraphicsGetCurrentContext()!)

        let finalImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return finalImage
    }
}

objective - c:

- (UIImage *)snapshot:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0);
    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

还看到:

https://developer.apple.com/library/ios/qa/qa1817/_index.html 如何捕获UIView到UIImage而不损失视网膜显示的质量