WKWebView изменить кадр и привести содержимое в соответствие без перезагрузки - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь встроить социальный пост (Instagram, Facebook и Twitter) в WKWebView, поэтому я использовал WKUserScript для вычисления высоты.

К сожалению, после загрузки WKWebView didFinish изменение кадра не влияет на отображаемое содержимое, как показано на рисунке.

Вот мой код:

var height: CGFloat = 0 {
    didSet {

        let frame = CGRect(x: 0, y: 0,
                                    width: SocialWebViewHelper.webViewWidth,
                                    height: self.height)
        self.webView.frame = frame
        self.webView.sizeToFit()
        self.webView.sizeThatFits(frame.size)
        self.webView.scrollView.sizeToFit()
        self.webView.scrollView.sizeThatFits(frame.size)
    }
}

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {

    guard let responseDict = message.body as? [String: Any],
        let height = responseDict["height"] as? CGFloat else {
            return
    }
    let newHeight = max(self.height, CGFloat(height))
    if self.height != newHeight {
        self.height = newHeight
    }
}

Любой идея как это исправить?

in picture:

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Проблема заключалась в том, что, несмотря на изменение высоты WebView, HTML.Body.Frame.Height не менялся. Поэтому я использовал JavaScript для обновления высоты кадра при обновлении высоты WebViews, например:

 private var height: CGFloat = SocialCellHelper.webViewDefaultHeight {
    didSet {
        self.webView.frame.size.height = 1
        self.webView.frame.size.height = self.height
        // Update iframe height manually
        // Fix problem of WebView content height not fitting WebViews frame height
        self.webView.evaluateJavaScript("document.getElementsByTagName('iframe')[0].style.height = \(self.height);") { (_, _) in
            self.webViewHeight.accept(self.height)
        }
    }
}
0 голосов
/ 01 апреля 2020

Следующий подход к получению высоты веб-контента работал для меня

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    webView.evaluateJavaScript("document.documentElement.scrollHeight", completionHandler: { (height, error) in
        DispatchQueue.main.async {
            self.height = height as! CGFloat
        }
    })
}
...