我有一个具有透明背景的WKWebView
,我想在保留透明性的同时捕获图像中的Web内容。我无法使用takeSnapshotWithConfiguration
,drawViewHierarchyInRect
或renderInContext
使用此功能。我认为这可能是不可能的。
这是我使用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];
}];
答案 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。