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是正确的匹配。我知道它的效率要高得多(尽管我还没有测试过这种说法)