如何使用透明背景拍摄WKWebView?

时间:2019-06-18 22:13:02

标签: ios objective-c wkwebview

我有一个具有透明背景的WKWebView,我想在保留透明性的同时捕获图像中的Web内容。我无法使用takeSnapshotWithConfigurationdrawViewHierarchyInRectrenderInContext使用此功能。我认为这可能是不可能的。

这是我使用takeSnapshotWithConfiguration方法的代码:

WKSnapshotConfiguration *wkSnapshotConfig = [WKSnapshotConfiguration new];
wkSnapshotConfig.snapshotWidth = [NSNumber numberWithInt:180];

[_webView takeSnapshotWithConfiguration:wkSnapshotConfig completionHandler:^(UIImage * _Nullable snapshotImage, NSError * _Nullable error) {
  NSString *tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"img.png"];
  NSData *photoData = UIImagePNGRepresentation(snapshotImage);
  [photoData writeToFile:tempFilePath atomically:YES];
}];

2 个答案:

答案 0 :(得分:2)

问题是_webView 本身具有不透明性。因此,即使显示的内容包含透明性,它们也基本上在视图的背景上呈现。

我能够捕获image with transparency的最小html并具有这种内联样式(请原谅我的html技能:P):

body {
    background: rgba(0, 0, 0, 0);
}

我已经通过将opaque属性设置为webview在iOS 11+上进行了验证(请注意,我没有为webview或其嵌入式滚动视图设置背景色。如果您的设置不同,猜你也应该将它们设置为清晰的颜色):


ObjC

_webView.opaque = NO;

快速

webView.isOpaque = false

其他一切与您的设置(WKSnapshotConfiguration / takeSnapshot...)完全一样

答案 1 :(得分:0)

如您所见,返回图像采用UIImage格式,根据定义,它可以存储Alpha通道。但是我不知道takeSnapshotWithConfiguration函数如何处理图像数据,但是从名称本身“快照”的角度来看,这将意味着没有透明度,并且快照始终会捕获您在显示器上看到的所有内容。您可以做的是将WebView的背景颜色更改为Lime颜色或其他颜色,然后对UIImage进行预处理,以将Lime颜色的任何像素设置为Alpha0。