Я собираю содержимое WKWebView
в UIImage
через CALayer
, используя следующее расширение к UIImage
:
extension UIImage {
class func imageFromLayer(layer: CALayer) -> UIImage {
UIGraphicsBeginImageContextWithOptions(layer.bounds.size, layer.isOpaque, 0.0)
layer.render(in: UIGraphicsGetCurrentContext()!)
let img = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return img!
}
}
Когда я рендерим захваченное изображение в UIImageView
, я вижу все из веб-вида в виде изображения; все, кроме видео, содержимое которого отображается в виде черного ящика. Я сталкиваюсь с той же проблемой, если использую функцию WKWebView takeSnapshot
или функцию drawHierarchy
класса UIView
для захвата UIImage
веб-представления. Кто-нибудь знает, почему видео отображаются в виде черных ящиков и как это можно исправить?
Обновление 1: Кроме того, все GIF-изображения в изображениях Google заморожены до щелчка. GIF можно разморозить, щелкнув по нему, после чего его размер изменяется, чтобы занять весь экран и начинается цикл.
Обновление 2: Я читал, что программное обеспечение для записи OBS иногда та же проблема возникает при захвате видео, когда используемый браузер использует аппаратное ускорение. Я также читал, что WKWebView
использует аппаратное ускорение. Есть ли способ отключить аппаратное ускорение в WKWebView
, чтобы попробовать это? В качестве альтернативы, UIWebView
использует аппаратное ускорение?
Обновление 3: Существует еще одна запись , сообщающая о подобной проблеме. Постер сообщает, что весь контент, отображаемый с помощью графического процессора, выглядит черным на его снимках экрана, и он считает, что проблема связана с аппаратным ускорением.
Обновление 4: При использовании функции быстрого просмотра Xcode, которую я наблюдал что слой, который передается в imageFromLayer
, не содержит видео (т. е. видео уже представлены как черные ящики в переданном в слое). Это заставляет меня думать, что WKWebView
не отображает видео на тот же слой, что и другой его контент. Это также заставляет меня думать, что, если бы я мог получить доступ к этому гипотетическому слою видео, я смог бы объединить два снимка, чтобы сформировать снимок всего веб-представления.
Обновление 5: Я пытался изменив мою функцию imageFromLayer
, чтобы она взяла UIView
вместо CALayer
, чтобы я мог передать WKWebView
напрямую. Модифицированная версия показана ниже, но она не решила проблему не отображаемых видео. Тем не менее, с помощью функции «быстрого просмотра» Xcode я смог заметить, что видео уже отсутствует в UIView
переданного в WKWebView
объекта.
class func createImage(view: UIView) -> UIImage {
UIGraphicsBeginImageContextWithOptions(view.frame.size, view.isOpaque, 0.0)
view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
let rasterizedView = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return rasterizedView
}
Update 6: Попытка захвата веб-вида с помощью UIWindow
, в котором он содержится, также приводит к тому, что видео не захватывается. Я использовал приведенный ниже код (обратите внимание, что keyWindow
устарела) и функцию быстрого просмотра Xcode, чтобы проверить эту идею.
let window = UIApplication.shared.keyWindow
let windowLayer = window!.layer