2017-09-05 123 views
1

我的應用使用WKWebView來呈現html字符串。 WkWebView嵌入在scrollView中,因爲我有其他幾個元素(例如按鈕,tableViews)。因此,我需要計算WkWebvView內容的大小,併爲此使用evaluateJavaScript(「document.body.scrollHeight」,completionHandler:方法。 每當我在html字符串中嵌入推文時,內容高度計算錯誤並且我的webview切一塊其高度的iOS WKWebView在嵌入鳴叫時計算高度不正確

已鳴叫嵌入這個樣子的HTML字符串的一部分:

<blockquote class=\"twitter-tweet\" data-lang=\"en\"><p><a href=\"https://twitter.com/hashtag/SYRIA?src=hash\">#SYRIA</a> Admiral Essen frigate launched <a href=\"https://twitter.com/hashtag/Kalibr?src=hash\">#Kalibr</a> cruise missiles against ISIS objects near Deir ez-Zor <a href=\"https://BLABLA*\">pic.twitter.com/azHAIii07g</a></p><p>— Минобороны России (@mod_russia) <a href=\"https://twitter.com/mod_russia/status/905007557554700288\">September 5, 2017</a></p></blockquote><p><script src=\"https://platform.twitter.com/widgets.js\"></script>

(BLABLA *實際上是t.co/azHAIii07g,我曾因爲計算器來代替規則)

是t這裏的東西缺少這個twitter代碼,或者我應該在webview方法中設置一些東西?

我試着從這篇文章實施解決方案:iOS Calculate correct WKWebview height for html string with embeded tweet但沒有成功,或者至少我能找出答案。

任何意見是讚賞??

更新: 我砍了一點點,發現可怕的解決方法,但它是問題出在哪裏的好主角。 這是全功能的,我使用的計算高度:

`func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { 
    self.webViewx.evaluateJavaScript("document.readyState", completionHandler: { 
     [weak self] (complete, error) in 
     if complete != nil {    self?.webViewx.evaluateJavaScript("document.body.offsetHeight", completionHandler: { 
       [weak self] (height, error) in 

    }) 
}` 

如果我把:

`DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+1, execute: { 
self?.webViewx.evaluateJavaScript("document.body.offsetHeight", completionHandler: { 
[weak self] (height, error) in 
print("HEIGHT AFTER 1 sec", height) 
    }) 
})` 

我得到正確的高度後1秒。現在,如何在正確的時間後更新高度?另外,一方面,如果我已經嵌入Facebook或Instagram的帖子,一切正常,因爲它應該和webview的高度得到正確的計算。

回答

0

隨着stackoverflow上的幾個帖子(特別是:Twitter Uncaught TypeError: undefined is not a function)和我的同事誰是一個Web開發人員,我設法找到了解決這個問題。 基本上,如果在webview需要加載的html字符串中嵌入了推文,則該腳本將添加到webview配置中。之後,我們應該實現userContentController didReceive消息函數,並且在其中我們應該評估webview的高度。

這裏是一個webview.loadHtmlString方法之前應該去的代碼:

if htmlString.contains("platform.twitter.com/widgets.js") { 
     let twitterJS: String = "window.twttr = (function(d, s, id) {var js, fjs = d.getElementsByTagName(s)[0],t = window.twttr || {};if (d.getElementById(id)) return t;js = d.createElement(s);js.id = id;js.src = \"https://platform.twitter.com/widgets.js\";fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, \"script\", \"twitter-wjs\"));twttr.ready(function (twttr) {twttr.events.bind('loaded', function (event) {window.webkit.messageHandlers.callbackHandler.postMessage('TWEET');});});" 
     let userScript = WKUserScript(source: twitterJS, injectionTime: .atDocumentEnd, forMainFrameOnly: false) 
     webViewx.configuration.userContentController.removeAllUserScripts() 
     webViewx.configuration.userContentController.addUserScript(userScript) 
     webViewx.configuration.userContentController.add(self, name: "callbackHandler") 
    } 

首先有一個檢查,如果一個HTML字符串有一個子是一個嵌入式的鳴叫。 分配給twitterJS的腳本是我們從twitter網頁獲得的。 最後一行很重要,因爲它給我們的腳本命名。

實際高度評價像這樣做:

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { 
    if message.name == "callbackHandler" { 
     print(message.body) 
     webViewx.evaluateJavaScript("document.body.offsetHeight", completionHandler: { (height, error) in 
      if let error = error { 
       print(error.localizedDescription) 
       return 
      } 
      if let height = height as? CGFloat{ 
       if height > self.kontejnerHeight.constant { 
        self.kontejnerHeight.constant = height 
       } 

      } 
     }) 
    } 
} 

希望這將幫助其他人。