2016-12-01 15 views
10

मुझे UITableView के अंदर WKWebView को एकीकृत करना है (कृपया उस पर सवाल न करें)।WKWebView "स्क्रीन के नीचे" सामग्री नहीं दिखा रहा है

मैंने सुनिश्चित किया कि WKWebView स्क्रॉल अक्षम है, इस तरह से मैं एक स्क्रॉल करने योग्य दृश्य (UITableView) के भीतर एक स्क्रोल करने योग्य दृश्य होने से बचता हूं।

हालांकि, जब WKWebview के अंदर HTML सामग्री बड़ी है, तो स्क्रीन के दो बार कहें, मुझे लगता है कि स्क्रीन के नीचे की सामग्री उपयोगकर्ता को नहीं दिखायी जाती है, यानी जब उपयोगकर्ता तालिका दृश्य को स्क्रॉल करता है तो वहां केवल सफेद \ खाली स्क्रीन जहां WKWebView है ...

मैं के अनुसार WebViewTableViewCell की ऊंचाई अद्यतन:

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

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

मुझे लगता है कि यह शायद WKWebView पर कुछ अनुकूलन जो यह डोम के केवल जब रेंडर होने देने के प्रभाव है वे स्क्रीन पर दिखाए जाते हैं।

मेरा सवाल यह है कि, WKWebView के अंदर की सभी सामग्री को तालिका दृश्य को स्क्रॉल करते समय यह सुनिश्चित करने के लिए मैं क्या कर सकता हूं?

पीएस UIWebView सभी सामग्री ठीक renders, यह केवल WKWebView

में हो रहा प्रतीत हो रहा है नीचे

छवि देखें:

enter image description here

+0

आप वेब व्यू फ्रेम/सेल आकार को कैसे और कब सेट कर रहे हैं? यदि आप दृश्य डीबगर पर रुकते हैं तो क्या विचार सही आकार हैं? – Wain

+0

अधिसूचना पोस्ट किए जाने पर वेबव्यू सेल –

+0

'webView.scrollView.contentSize' का आकार बदलने के तरीके के बारे में मेरे संपादन देखें। मैं 'webView.scrollView.contentSize' keyPath पर एक पर्यवेक्षक जोड़ने और फिर वहां से अपने सेल आकार को अपडेट करने का सुझाव देता हूं। –

उत्तर

9

आप WKWebView, (स्विफ्ट) पर setNeedsLayout कॉल कर सकते हैं:

नोट इस UITableView के लिए scrollview है।

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 not rendering correctly in iOS 10

1

यह वास्तव में एप्पल अनुकूलन है - वेब देखने के केवल दृश्य भाग रेंडर करने के लिए। इस मुद्दे के बारे में कई इसी तरह के सवाल कर रहे हैं: तालिका दृश्य प्रतिनिधि के scrollViewDidScroll: विधि में [self.webView setNeedsDisplay] कॉल करने के लिए

WKWebView screenshot not completely rendering full page height

How to capture a full page screenshot of WKWebview?

प्रयास करें।

1

यकीन है कि जब सेल ऊंचाई को अद्यतन करने, TableViewCell WebView पुन: लोड नहीं किया गया है। अन्यथा आप अंतहीन पाश में फंस जाएंगे और अजीब व्यवहार और ऊंचाई बार-बार रीसेट हो जाएगी।

var CGFloat : webViewHeight = 0.0 

// वेब दृश्य की वर्तमान ऊंचाई को ट्रैक करें।

// 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 
} 
संबंधित मुद्दे