Как сделать снимок WKWebView с прозрачным фоном? - PullRequest
3 голосов
/ 19 июня 2019

У меня есть WKWebView с прозрачным фоном, и я хотел бы захватить веб-содержимое на изображении, сохраняя при этом прозрачность. Я не смог заставить это работать с 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];
}];

Ответы [ 2 ]

2 голосов
/ 22 июня 2019

Проблема в том, что _webView сам имеет непрозрачность. Таким образом, даже если отображаемое содержимое содержит прозрачность, оно в основном отображается на фоне представления.

Я смог захватить изображение с прозрачностью , минимального HTML с таким встроенным стилем, как этот (извините за мои навыки HTML: P):

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

Я подтвердил это на iOS 11+, просто установив свойство opaque для веб-просмотра (обратите внимание, что я не установил цвет фона для веб-просмотра или встроенного прокрутки. Если у вас другие настройки, я думаю, вы следует также установить их, чтобы очистить цвет):


ObjC

_webView.opaque = NO;

Swift

webView.isOpaque = false

все остальное точно так же, как в вашей настройке (WKSnapshotConfiguration / takeSnapshot...)

0 голосов
/ 19 июня 2019

Как видите, возвращаемое изображение в формате UIImage, который по определению способен хранить альфа-канал.Но я понятия не имею, как функция takeSnapshotWithConfiguration обрабатывает данные изображения, но из самого имени «снимок» говорит о том, что прозрачности не будет, и снимок всегда захватывает все, что вы видите на дисплее.Что вы можете сделать, это изменить цвет фона WebView на Lime color или другой цвет, а затем предварительно обработать UIImage, чтобы установить любой пиксель, который имеет цвет Lime, на Alpha 0.

...