Подтвердить что ты не робот

WKWebView не показывает содержимое "под экраном"

Мне нужно интегрировать WKWebView внутри UITableView (просьба не спрашивать об этом).

Я убедился, что прокрутка WKWebView отключена, поэтому я не вижу прокручиваемого вида в прокручиваемом представлении (UITableView).

Однако, когда содержимое HTML внутри WKWebview велико, скажем дважды на экране, я обнаруживаю, что содержимое под экраном не отображается пользователю, то есть когда пользователь прокручивает вид таблицы, есть только белый\пустой где WKWebView...

Я обновляю высоту WebViewTableViewCell в соответствии с:

public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

    let height = webView.scrollView.contentSize.height
    ...
    ...
    delegate.updateWebViewCellHeight(height: self.cellHeight)
}

Я предполагаю, что это, вероятно, эффект некоторой оптимизации на WKWebView, которая позволяет отображать DOM только тогда, когда они отображаются на экране.

Мой вопрос: что я могу сделать, чтобы убедиться, что все содержимое внутри WKWebView отображается пользователю при прокрутке табличного представления?

P.S. UIWebView делает все содержимое просто прекрасным, похоже, это происходит только в WKWebView

См. изображение ниже:

введите описание изображения здесь

4b9b3361

Ответ 1

Вы можете вызвать setNeedsLayout в WKWebView, (Swift):

Обратите внимание, что это scrollView для UITableView.

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    // use IndexPath for row/section with your WKWebView
    if let cell = tableView.cellForRow(at: IndexPath(row: 1, section: 0)) as? WKWebViewCell { // Here we take our cell
        cell.wkWebView?.setNeedsLayout()
    }
}

См. WKWebView не корректно отображает в iOS 10

Ответ 2

Это действительно оптимизация Apple - отображение только видимой части веб-представления. Есть несколько похожих вопросов по этой проблеме:

Снимок экрана WKWebView не полностью отображает полную высоту страницы

Как захватить полный скриншот страницы WKWebview?

Попробуйте вызвать [self.webView setNeedsDisplay] в методе делегата таблицы scrollViewDidScroll:.

Ответ 3

Убедитесь, что при обновлении высоты ячейки TableViewCell не перезагружает WebView. В противном случае вы застряли в бесконечном цикле, и странное поведение и высота будут reset снова и снова.

var CGFloat : webViewHeight = 0.0 

//Отслеживаем текущую высоту webView.

// MARK: - WKWebView Delegate
public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

    weak var weakSelf = self
    webView.evaluateJavaScript("document.documentElement.style.webkitUserSelect='none';") { (object : Any?, error : Error?) in

        if (error == nil) {
            let size : CGRect = self.heightForWebView(webView: webView)

            if (weakSelf.webViewHeight == 0.0 || size.height != weakSelf.webViewHeight){
                weakSelf.webViewHeight = size.height
            }

            webView.frame = size
            delegate.updateWebViewCellHeight(height: size.height)
        }
    }
}

// MARK: - WKWebView Heplper
func heightForWebView(webView : WKWebView)-> CGRect {
    var rect : CGRect = webView.frame as CGRect!
    rect.size.height = 1
    webView.frame = rect

    let newSize : CGSize = webView.sizeThatFits(CGSize.zero)
    rect.size = newSize

    return rect
}