如何拍摄未渲染的UIView的快照?

Vul*_*kan 5 iphone objective-c uiview uiimage ios

我使用此方法拍摄快照:

UIView *snapshotView = [someView snapshotAfterScreenUpdates:NO];
Run Code Online (Sandbox Code Playgroud)

这给了我一个可以玩的UIView.

但是,我需要它的UIImage而不是UIView.

这是我用于将UIView转换为UIImage的方法:

- (UIImage *)snapshotOfView:(UIView *)view
{
    UIImage *snapshot;

    UIGraphicsBeginImageContext(view.frame.size);

    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    snapshot = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return snapshot;
}
Run Code Online (Sandbox Code Playgroud)

它不起作用,快照是一个空白的UIImage,因为snapshotView没有呈现.

显而易见的事情是直接拍摄视图的快照,而不是以UIView的形式拍摄快照然后转换它.

显而易见的方法的问题是我使用的WKWebView有一个巨大的错误,不允许你截取屏幕截图.这是真的,我甚至报告了这个错误,他们说他们正试图修复它.

那么,如何在不渲染的情况下拍摄snapshotView的快照(UIImage)呢?

Ale*_*nin 9

由于接受者的回答对我不起作用(一直UIGraphicsGetImageFromCurrentImageContext()返回nil),我为 iOS10+找到了不同的解决方案

let renderer = UIGraphicsImageRenderer(size: view.bounds.size)
let image = renderer.image { _ in view.drawHierarchy(in: view.bounds, afterScreenUpdates: true) }
Run Code Online (Sandbox Code Playgroud)

PS 你可能想在渲染之前调用updateConstraintsIfNeeded()layoutIfNeeded()


fou*_*dry 8

drawViewHierarchyInRect会为你工作.您可以直接在WKWebView上使用它.

Apple Technical Q&A有一些有用的细节.我也在这里回答一个稍微不同的问题.

我在UIView的类别中使用它:

@implementation UIView (ImageSnapshot)
- (UIImage*)imageSnapshot {
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, 
                                    YES, self.contentScaleFactor);
    [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}
@end
Run Code Online (Sandbox Code Playgroud)

我不知道你用'显而易见的方法'是什么意思 - 但我已经在WKWebView上对它进行了测试并且它有效.