2009-04-13 11 views
70

मैं के रूप में करने के लिए this questionएक चरणीय ऊंचाई UITableView के भीतर, सामग्री के आधार पर UIWebView ऊंचाई कैसे निर्धारित करें?

मेरे समस्या जवाब में विस्तार से बताया चर ऊंचाई पंक्तियों के साथ एक UITableView बनाने के लिए कोशिश कर रहा हूँ है प्रत्येक कोशिका में शामिल है एक UIWebView अलग (स्थिर लोड) सामग्री मैं समझ नहीं कैसे उचित की गणना करने के साथ सामग्री के आधार पर ऊंचाई। क्या इसे करने का कोई तरीका है? मैं इस तरह की बातें की कोशिश की है:

(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
     WebViewCell *cell = (WebViewCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath]; 
     [cell setNeedsLayout]; 
     [cell layoutIfNeeded]; 
     return cell.bounds.size.height; 
    } 

कोशिकाओं स्वयं एक निब, जो केवल एक UITableViewCell एक UIWebView युक्त से लोड किए गए हैं। (यह भी ठीक होगा अगर कोशिकाओं ने स्वयं को एचटीएमएल सामग्री के सबसे बड़े हिस्से में समायोजित किया है, हालांकि परिवर्तनीय ऊंचाई अच्छी होगी)।

+0

क्या आपने कभी यह पता लगाया कि यह कैसे किया जाए? नीचे दिए गए उत्तर आपको ऊंचाई प्राप्त करते हैं, लेकिन जब तक आपको इसकी आवश्यकता नहीं होती है। ऊंचाई के लिए ऊंचाई की गणना कैसे कर सकते हैं ForRowAtIndexPath क्या आपको WebViewDidFinishLoad में कॉलबैक (वेबव्यू प्रतिनिधि) कॉल पर भरोसा करना है? – pbx

+0

हाय तो अंत में आप वेबव्यू की ऊंचाई कैसे निर्धारित करते हैं मुझे भी एक ही समस्या है ... –

+0

किसी के पास कोई समाधान है ???? अभी भी इसे समझ नहीं सकते .. – mikemike396

उत्तर

76

यह कोड शायद तालिका दृश्य उपयोग के लिए बहुत धीमा है, लेकिन यह चाल है। ऐसा लगता है कि कोई विकल्प नहीं है, क्योंकि UIWebView DOM तक सीधे पहुंच प्रदान नहीं करता है।

में एक दृश्य नियंत्रक के viewDidLoad मैं वेब दृश्य में कुछ HTML लोड और तत्व ऊंचाई वापस जाने के लिए कुछ जावास्क्रिप्ट चलाने जब लोड समाप्त हो गया है।

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    webview.delegate = self; 
    [webview loadHTMLString:@"<div id='foo' style='background: red'>The quick brown fox jumped over the lazy dog.</div>" baseURL:nil]; 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    NSString *output = [webview stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"foo\").offsetHeight;"]; 
    NSLog(@"height: %@", output); 
} 
+0

लगता है जैसे इसे काम किया जा सकता है, हालांकि मैंने टेबल दृश्य में यह कोशिश की है और यह एक खाली स्ट्रिंग देता है (मुझे लगता है क्योंकि वेबव्यू लोडिंग समाप्त नहीं हुआ था)। मुझे लगता है कि मैं इसे ऑफस्क्रीन वेबव्यू के साथ संभवतः प्रीकंप्यूट कर सकता हूं और टेबलव्यू के परिणामों को कैश कर सकता हूं। – frankodwyer

+0

क्या आप webViewDidFinishLoad में ऊंचाई माप रहे हैं? वह प्रतिनिधि कॉलबैक इंगित करता है कि लोड पूरा हो गया है। यह एक खाली स्ट्रिंग वापस नहीं करना चाहिए। – duncanwilcox

+0

यह लगभग वही है जो मैं करता हूं। यद्यपि मुझे इस तथ्य में कोई समस्या है कि वेबव्यू लोड होने तक अपना आकार वापस नहीं कर सकता है, जब तालिका में इसके आकार को जानने की आवश्यकता नहीं हो सकती है। क्या किसी को इसका हल करने का विचार है? –

28

मुझे आपके उत्तरों को खोजने में बहुत खुशी हुई, जावास्क्रिप्ट चाल ने मेरे लिए अच्छा काम किया।

हालांकि, मैं कहना है वहाँ भी है कि चाहता था "sizeThatFits:" विधि:

CGSize goodSize = [webView sizeThatFits:CGSizeMake(anyWidth,anyHeigth)]; 

हम एक वांछित आकार शून्य से अलग सेट करने के लिए है, लेकिन इसके अलावा, यह आम तौर पर हमेशा काम करता है!

आमतौर पर, क्योंकि UIWebViews के साथ, यह केवल दूसरी लोडिंग पर काम करता है (मैं "loadHTMLString:" विधि का उपयोग करता हूं, और हाँ मैं प्रतिनिधि "didFinishLoad:" विधि से "sizeThatFits:" को कॉल करता हूं)।

तो, यही कारण है कि मैं आपके समाधान को खोजने में बहुत खुश था जो किसी भी मामले में काम करता है।

+1

+1 यह कुछ प्रमुख अपवित्रता के लायक है! – mvds

+0

मैं इसे आईओएस 4.2 – Shade

+0

@Shade पर काम करने के लिए नहीं मिल सकता: मेरा जवाब देखें कि यह काम नए आईओएस संस्करणों पर कैसे बनाया जाए। –

6

ऐसा लगता है कि यह काम करता है। अभी के लिए।

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    CGFloat webViewHeight = 0.0f; 
    if (self.subviews.count > 0) { 
     UIView *scrollerView = [self.subviews objectAtIndex:0]; 
     if (scrollerView.subviews.count > 0) { 
      UIView *webDocView = scrollerView.subviews.lastObject; 
      if ([webDocView isKindOfClass:[NSClassFromString(@"UIWebDocumentView") class]]) 
       webViewHeight = webDocView.frame.size.height; 
     } 
    } 
} 

यह विफल होने पर 0 को सुरक्षित रूप से वापस कर देना चाहिए।

+3

यह कैसे बेहतर है: [वेबव्यू स्ट्रिंगबैवलुएटिंग जावास्क्रिप्टफ्रमस्ट्रिंग: @ "document.getElementById (\" foo \ ") ऑफसेट हाइट;"] ;? समस्या यह है कि वेबव्यू लोड होने तक अपना आकार वापस नहीं कर सकता है, जब तालिका में इसके आकार को जानने की आवश्यकता नहीं हो सकती है। –

3

यदि आपके पास पहली बार आकार के साथ खराब मूल्य हैं लेकिन बाद में नहीं, तो यहां संभावित कारण है: बाहरी सीएसएस के साथ एक बग। ऐसा लगता है कि बाहरी सीएसएस पुनर्प्राप्त होने से पहले, वेब दस्तावेज़ पूरी तरह से निर्मित होने से पहले WebViewDidFinisLoad को जल्द ही बुलाया जाता है। मुझे लगता है कि यदि आप कैश के कारण पुनः लोड करते हैं तो बग गायब हो जाता है।

एक चाल: जल्द ही अपने एप्लिकेशन में एक डमी UIWebView के साथ अपने सीएसएस को प्रीलोड करें।

एसडीके: IOS4

+0

मेरे मामले में यह इतना सीएसएस नहीं था जो देर से लोड किया गया था, लेकिन विशेष रूप से सीएसएस में एक फ़ॉन्ट-फ़ाइल। – beetstra

4

समस्या -sizeThatFits: साथ है कि यह बॉक्स से बाहर काम नहीं करता है, आईओएस 4.1 पर कम से कम नहीं है। यह सिर्फ वेब व्यू का वर्तमान आकार देता है (इससे कोई फर्क नहीं पड़ता कि इसे CGSizeZero या मनमाने ढंग से गैर-शून्य आकार के साथ कहा जाता है)।

मुझे पता चला कि यह वास्तव में काम करता है यदि आप -sizeThatFits: पर कॉल करने से पहले वेब व्यू की फ्रेम ऊंचाई को कम करते हैं।

मेरी समाधान देखें: How to determine the content size of a UIWebView?

+0

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

3

वेब दृश्य को मापने लेकिन काम करता है केवल जब यह भरा हुआ है इसकी सामग्री

  • बनाने वेबव्यू छोटे (जैसे 5px)
  • यह लोड और खत्म करने के लिए इंतजार
  • कॉलिंग आकार उस पर टॉफिट करें
  • आकार प्राप्त करने के बाद THEN
  • tablev को पुनः लोड करें iew (सेल के लिए सही ऊंचाई वापसी)

विज्ञापन:: डी जो इस

+0

यह काम करता है! धन्यवाद, मैंने जावास्क्रिप्ट के साथ दृष्टिकोण से पहले उपयोग किया था, लेकिन यह मेरे लिए बेहतर काम करता है। – Stan

2

बेहतर दृष्टिकोण नीचे की तरह scrollView.contentSize.height संपत्ति का उपयोग करने, है के साथ संघर्ष GitHub पर मेरी M42WebviewTableViewCell वर्ग देखते हैं।

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    NSLog(@"%f",webView.scrollView.contentSize.height); 
} 
+1

यह मेरे लिए काम किया। धन्यवाद। –

+0

मेरे लिए, यह scrollView.contentSize.height - CGRectGetHeight (scrollView.frame) है। http://stackoverflow.com/a/39386880/1677041 – Itachi

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