2016-01-10 11 views
10

में एम्बेडेड है, मैं इसके साथ दो दिनों तक संघर्ष कर रहा हूं, इसलिए मैं इंटरनेट के बुद्धिमान लोगों को हाथ में आ गया हूं।UIWebView की संपूर्ण सामग्री UITableView

मैं अपने UITableView के हिस्से के रूप में एक लेख दिखा रहा हूं। इसके लिए सही तरीके से प्रदर्शित करने के लिए, मुझे प्रतिनिधि को सेल के लिए ऊंचाई देने की आवश्यकता है, जिसे मैं UIWebView की ऊंचाई के समान होना चाहता हूं, इसलिए मैं वेबव्यू पर स्क्रॉल अक्षम कर सकता हूं और वेब सामग्री को पूरी तरह से प्रदर्शित कर सकता हूं स्थैतिक सेल

मेरा पहला दृष्टिकोण इसे heightForRowAtIndexpath विधि में प्रस्तुत करना था, लेकिन यह स्पष्ट रूप से काम नहीं करता क्योंकि मुझे UIWebViewDelegate के लिए प्रतीक्षा करने की आवश्यकता है ताकि मुझे यह बताने के लिए कि वेब दृश्य पूरी तरह से लोड हो और ऊंचाई हो। थोड़ी देर बाद मुझे एक कामकाजी समाधान मिला, जिसने वेब व्यू लोड होने पर सेल ऊंचाई को रीफ्रेश करने के लिए वेब व्यू प्रतिनिधि का उपयोग किया।

स्क्रीन आकार में बदलाव होने तक ठीक काम करता है। या तो घुमाएं या मेरे UISplitView पूर्ण स्क्रीनिंग से। मैंने didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) में इसे अपडेट करने के लिए मजबूर किया, लेकिन इससे सही ऊंचाई में बसने से पहले लगभग 10 बार फ्लैश हो जाता है। मैंने इस बदलाव को लॉग किया है, और ऐसा लगता है कि वेबव्यू खुद को कई बार बुला रहा है, जिससे लूप होता है।

जैसा कि मैंने स्क्रीन को घुमाने पर शुरू किया, this लॉग में देखा गया था।

यह हर बार फिर से लोड होने पर चमकता है, और जैसा कि आप देख सकते हैं, यह स्वयं को कई गुना पुनः लोड करता है।

तो। मुझे एक यूट्यूबव्यू के अंदर एक संपूर्ण वेब दृश्य सामग्री दिखाने का एक तरीका चाहिए, और जब स्क्रीन आकार बदलता है तो विश्वसनीय रूप से ऊंचाई प्राप्त करें। अगर किसी ने इसे किसी भी तरह से प्रबंधित किया है, तो कृपया मुझे बताएं। मैं किसी को भी इनाम दूंगा और मेरा पहला बच्चा जो इसे हल कर सकता है, क्योंकि यह मुझे पागल कर रहा है।

यहां मेरा प्रासंगिक कोड है।

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    switch indexPath.row { 
case 4: 
     //Content 
     print("Height for row called") 
     return CGFloat(webViewHeight) 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    switch (indexPath.row){ 
//HTML Content View 
    case 4: 
     let cell = tableView.dequeueReusableCellWithIdentifier("ContentCell", forIndexPath: indexPath) 
     var contentCell = cell as? ContentCell 
     if contentCell == nil { 
      contentCell = ContentCell() 
     } 
     contentCell?.contentWebView.delegate = self 
     contentCell?.contentWebView.scrollView.userInteractionEnabled = false 
     contentCell?.contentWebView.loadHTMLString((post?.contentHTML)!, baseURL: nil) 
     print("Cell For row at indexpath called") 
     return contentCell! 
} 
func webViewDidFinishLoad(webView: UIWebView) { 
    updateHeight() 
} 

func updateHeight(){ 
    let webView = (self.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: 4, inSection: 0)) as! ContentCell).contentWebView 
    if self.webViewHeight != Double(webView.scrollView.contentSize.height) { 
     print("Previous WV Height = \(self.webViewHeight), New WV Height = \(webView.scrollView.contentSize.height)") 
     self.webViewHeight = Double(webView.scrollView.contentSize.height) 
     tableView.reloadRowsAtIndexPaths([NSIndexPath(forRow: 4, inSection: 0)], withRowAnimation: .Automatic) 
    } else { 
     return 
    } 
} 

override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) { 
    print("rotated") 
     self.updateHeight() 
     //tableView.reloadRowsAtIndexPaths([NSIndexPath(forRow: 4, inSection: 0)], withRowAnimation: .Automatic) 
} 
+0

मुझे पहले यह समस्या आई है, और चूंकि UIWebViews आमतौर पर एक जादू का काला बॉक्स होता है, इसलिए मैं अक्सर एक वर्कअराउंड का उपयोग कर समाप्त होता हूं। मान लें कि आपका आलेख अधिकतर टेक्स्ट है, यूटीएमटीवी व्यू के माध्यम से एचटीएमएल सामग्री को मूल रूप से प्रदर्शित करने पर विचार करें, अपने एचटीएमएल को एक जिम्मेदार स्ट्रिंग के रूप में। UITextView में HTML प्रदर्शित करने के मूल उदाहरण के लिए, इस उत्तर को देखें: http://stackoverflow.com/a/20996085/209855 –

+0

@AaronAsh मैंने इसमें देखा, लेकिन ऐसा लगता है कि HTML सामग्री पार्स के साथ जिम्मेदार लेबल बहुत धीमे हैं टेबल्स का समर्थन नहीं करने के अलावा, मेरे उपयोग-मामले। अफसोस की बात है ... –

+0

आपको इसे टेबलव्यू सेल में लाने में बहुत कठिनाई नहीं होनी चाहिए, यहां एक नज़र डालें: http://stackoverflow.com/a/18818036/209855 इसके अलावा, मैंने लोगों को धीमे HTML पार्सिंग के बारे में शिकायत की है, लेकिन इसे अभ्यास में कभी नहीं देखा। एक शॉट देने के लायक अभी भी? –

उत्तर

0

मैंने इसे बदलकर हल किया .ऑटोमैटिक टू। पंक्ति में एनीमेशन बदलें। यह अभी भी एक बुरा समाधान है, लेकिन कम से कम यह अब झिलमिलाहट नहीं करता है।

-1

मुझे आपके कार्यान्वयन में कोई समस्या नहीं दिखाई दे रही है। ट्रे कुछ चीजें वहाँ कुछ चीजें आप जाँच कर सकते हैं

func webViewDidFinishLoad(webView: UIWebView) { 
    updateHeight() 
    //This function may get called multiple times depending on webpage. 
} 

//Use 
     self.tableView.beginUpdates() 
     self.tableView.endUpdates() 
//Instead of 
tableView.reloadRowsAtIndexPaths([NSIndexPath(forRow: 4, inSection: 0)], withRowAnimation: .None) 

    func updateHeight(){ 
     let webView = (self.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: 4, inSection: 0)) as! ContentCell).contentWebView 
     if self.webViewHeight != Double(webView.scrollView.contentSize.height) 
     { 
      print("Previous WV Height = \(self.webViewHeight), New WV Height = \(webView.scrollView.contentSize.height)") 
      self.webViewHeight = Double(webView.scrollView.contentSize.height) 
      self.tableView.beginUpdates() 
      self.tableView.endUpdates() 
//   tableView.reloadRowsAtIndexPaths([NSIndexPath(forRow: 4, inSection: 0)], withRowAnimation: .None) 
     } else { 
      return 
     } 
    } 

override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) 
{ 
    print("rotated") 
    let webView = (self.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: 4, inSection: 0)) as! ContentCell).contentWebView 
    webView.reload(); 
} 

आप उन्मुखीकरण परिवर्तन पर वेबव्यू को फिर से लोड करने की आवश्यकता होगी रहे हैं।

0

मैं अनुशंसा करता हूं कि आप तालिका दृश्य से स्वतंत्र रूप से वेब दृश्य ऊंचाई की गणना करें और डेटा के हिस्से के रूप में आयाम को संग्रहित करें और इसे ऊंचाई में वापस लौटें ForRowAtIndexPath कॉल। यह एक आसान तरीका है क्योंकि आपको तालिका दृश्य प्रदर्शन के दौरान तालिका ऊंचाई की गणना करने से निपटने की आवश्यकता नहीं है। जब एचटीएमएल सामग्री लोड नहीं होती है तो मानक ऊंचाई और वेब दृश्य के लिए एक संदेश का उपयोग करें।

संबंधित मुद्दे