2013-05-24 4 views
5

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

NSString *output = [webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"]; 

या (मैं इस बनाया) कुछ इस तरह कर रही है:

self.webView = webView; 
CGRect frame = webView.frame; 
frame.size.height = 1; 
webView.frame = frame; 
CGSize fittingSize = [webView sizeThatFits:CGSizeZero]; 
frame.size = fittingSize; 
webView.frame = frame; 

इन तरीकों में से दोनों लौट

-(void)webViewDidFinishLoad:(UIWebView *)webView 

वे ऊंचाई की गणना करने के लिए या तो नीचे के रूप में जावास्क्रिप्ट का उपयोग कर कहते हैं कि वेबव्यू की सही ऊंचाई, लेकिन तालिकादृश्य शुरू होने के बाद वे होते हैं। यह WebViewDidFinishLoad ऊंचाई ForRowAtIndexPath विधि के बाद बुलाया जाता है। तो जब टेबल बनाया जा रहा है तो मेरे पास सेल की ऊंचाई नहीं है। तो फिर हर कोई अच्छी तरह से कहता है, तो बस अपने वेब व्यूडिडफिनिश लोड के अंदर एक टेबलव्यू रीलोड करें जो अभी तक काम करता है, लेकिन मुझे यह पसंद नहीं है क्योंकि वहां एक अंतराल है और जब आप उस हिस्से में जाते हैं तो यह टेबलव्यू चॉकलेट की स्क्रॉलिंग करता है। मैं इसे कैसे ठीक करूं? और इसे चिकनी बनाओ? मैं शायद लोड लोड करने से पहले वेबव्यू ऊंचाई को निर्धारित करने के बारे में सोच रहा था, लेकिन यह सुनिश्चित नहीं करता कि मैं यह कैसे करूं। एचटीएमएल को एक सादे पाठ स्ट्रिंग में परिवर्तित करने का भी प्रयास किया, लेकिन इसके परिणामस्वरूप झूठी ऊंचाई होती है क्योंकि एचटीएमएल में स्पेस और सामान होता है जबकि सादा पाठ नहीं होता है। किसी भी सहायता की सराहना की जाएगी!

+1

क्या आप वेब दृश्य ऑफ-स्क्रीन को जल्द से जल्द लोड कर सकते हैं ताकि ऊंचाई से पहले इसे समाप्त होने की संभावना हो। ForRowAtIndexPath को कॉल किया जाता है? इसके अलावा, क्या आपने अंतराल और चापलूसी की प्रकृति को निर्धारित किया? शायद उस समस्या को हल किया जा सकता है। –

+0

ग्रेट आइडिया! यही वह है जो मैंने कर दिया। – mikemike396

उत्तर

3

मेरा सुझाव स्क्रीन से वेबव्यू प्रस्तुत करके @ टिमोथी मूस के समान है।

दृष्टिकोण मैं यहाँ ले जाएगा होगा ...

-(void)viewDidLoad 
{ 
    //Create a UIWebView and store it in a property 
    //Hook the delegate to the view controller. 
    //Load the html string to the UIWebView. 

    //The rest of your initialization 
} 

इस मामले में, अपने heightForRowAtIndexPath: अभी भी शायद वेब दृश्य के पूरा होने से पहले कहा जाता हो जाएगा।

आप इसे दो तरीकों से संभाल सकते हैं। यहां एक सुझाव दिया गया है।

UIWebView के webViewDidFinishLoading की प्रतिनिधि विधि में, यह सुनिश्चित करने के लिए जांचें कि कॉल करने वाला वेबव्यू आपकी संपत्ति में संग्रहीत वेबव्यू है। यदि ऐसा है, तो उस अनुभाग (या पंक्ति) को फिर से लोड करने के लिए कॉल करें जिसमें आपका वेबव्यू शामिल है। इसे heightForRowAtIndexPath: विधि को फिर से कॉल करने के लिए कॉल करना चाहिए, जिसमें यह मामला है, आप webViewDidFinishLoading कॉलबैक में वेबव्यू की ऊंचाई संग्रहीत कर सकते हैं।

यदि दृश्य पहली बार दिखाता है कि सेल स्क्रीन बंद है, तो cellForRowAtIndexPath: में बनाया गया सेल, UIWebView होना चाहिए जिसे आपने अपने viewDidLoad में बनाया था। सेल के सामग्री दृश्य में UIWebView जोड़ कर ऐसा करें।

यदि दृश्य पहली बार दिखाता है तो सेल स्क्रीन पर है, तो मैं पहली बार सेल लोड होने पर एक गतिविधि स्पिनर का सुझाव दूंगा, और फिर वेबव्यू लोड होने के बाद, वेबव्यू के साथ सेल को फिर से लोड करें।

+0

महान जवाब! यह एकमात्र समाधान था जो काम करता था। वेब लोडिंग स्क्रीन को लोड करना और फिर ऊँचाई को सही ढंग से संग्रहीत करना। सेलफोर्वाएट इंडेक्स विधि के दौरान मेरे पास एकमात्र मुद्दा सेल पर वापस वेबव्यू जोड़ रहा था। – mikemike396

4

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

यदि आप बार-बार उसी HTML को लोड करते हैं तो आप ऊंचाई को कैश कर सकते हैं, लेकिन आपको अभी भी पहली बार समस्या हो रही है।

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

लेकिन इसके बारे में क्या सेल ऊंचाई डिफ़ॉल्ट हाइट और सही ऊंचाई के बीच एनिमेट करती है? शायद यह अधिक स्वीकार्य होगा।

यदि आप केवल ऊंचाई में परिवर्तन कर रहे हैं, तो मेरा मानना ​​है कि आप आकार बदलने के लिए, पुनः लोड करने के बजाय ऐसा कर सकते हैं।

[tableView beginUpdates]; 
[tableView endUpdates]; 

दो लाइनों के बीच कुछ भी आवश्यक नहीं है।

हो सकता है कि आप अगली बार उपयोगकर्ता इसे देखने में स्क्रॉल करते समय HTML की वास्तविक ऊंचाई को कैशिंग के साथ जोड़ सकें।

+0

बिल्कुल सही !! बिलकुल उत्तम। चीयर्स।! –

0

आपके मामले में आपके पास टेबलव्यूसेल में वेबव्यू है, इसलिए ऊंचाई में ForRowAtIndexPath ने सेल की ऊंचाई को एनएसएट्रिब्यूटेड स्ट्रिंग आकार की ऊंचाई पर सेट किया है।

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 


    NSAttributedString *attributedText = [NSString getHTMLAttributedString:@"HTML Content"]; 
    CGSize size = CGSizeMake(300, CGFLOAT_MAX); 
    CGRect paragraphRect =  [attributedText boundingRectWithSize:size 
           options:(NSStringDrawingUsesLineFragmentOrigin) 
           context:nil]; 
    return paragraphRect.size.height; 
} 

+(NSAttributedString *) getHTMLAttributedString:(NSString *) string{ 
    NSError *errorFees=nil; 
    NSString *sourceFees = [NSString stringWithFormat: 
          @"<span style=\"font-family: 'Roboto-Light';font-size: 14px\">%@</span>",string]; 
    NSMutableAttributedString* strFees = [[NSMutableAttributedString alloc] initWithData:[sourceFees dataUsingEncoding:NSUTF8StringEncoding] 
                       options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, 
                          NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]} 
                     documentAttributes:nil error:&errorFees]; 
    return strFees; 

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