Ios 如何拍摄非';没有渲染?

Ios 如何拍摄非';没有渲染?,ios,objective-c,iphone,uiview,uiimage,Ios,Objective C,Iphone,Uiview,Uiimage,我使用此方法拍摄快照: UIView *snapshotView = [someView snapshotAfterScreenUpdates:NO]; 这给了我一个可以玩的UIView 但是,我需要它的UIImage,而不是UIView 这是我用于将UIView转换为UIImage的方法: - (UIImage *)snapshotOfView:(UIView *)view { UIImage *snapshot; UIGraphicsBeginImageContext(v

我使用此方法拍摄快照:

UIView *snapshotView = [someView snapshotAfterScreenUpdates:NO];
这给了我一个可以玩的UIView

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

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

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

    UIGraphicsBeginImageContext(view.frame.size);

    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    snapshot = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return snapshot;
}
它不起作用,快照是一个空白的UIImage,因为snapshotView没有渲染

显然,要做的事情是直接获取视图的快照,而不是以UIView的形式获取快照,然后对其进行转换

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


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

drawViewHierarchyInRect
适用于您。您可以直接在WKWebView上使用此选项

这方面有一些有用的细节。在回答一个稍微不同的问题时,我也谈到了这一点

我在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

我不知道你所说的“显而易见的方法”是什么意思,但我已经在一个WKWebView上测试了这个方法,它是有效的。

因为接受者的答案对我来说不起作用(
UIGraphicsGetImageFromCurrentImageContext()
一直返回
nil
),我在iOS10+上发现:

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

另外,在渲染之前,您可能需要调用
updateConstraintsIfNeeded()
layoutIfNeeded()
,先生,您真是太棒了!您好@foundry,我很好奇您是否仍然认为这是iOS 9.2和Xcode 7.2(7C68)的有效解决方案?我得到一个白色图像。@chinjazz:我刚刚用ios9.2和ios8.4的模拟器版本尝试了Xcode 7.2(7C68)(用于比较)。。都很好,谢谢你的确认!我发现在模拟器中,屏幕图像将第一次呈现给WKWebView,但不会在下一次加载时呈现(在下一次加载时,屏幕图像是白色的)。。可能是我这边的一个bug,但我会在设备上检查它的一致性。我发现,在webView女妖导航之后,WKWebView增加了一个延迟,它工作得更好…@HussainShabbir-不是一个傻瓜,不同的问题,不同的答案。另一个答案可能已经完成了这项工作,但这一个与苹果当前的API是正确的匹配。我知道它的效率要高得多(尽管我还没有测试过这种说法)