2011-09-27 20 views
10

ड्राइंग के लिए सर्वोत्तम अभ्यास संभवतः एक डुप्लिकेट लेकिन मुझे SO पर एक विशिष्ट प्रश्न नहीं मिला, तो यहां यह है।गतिशील UITableView पंक्ति ऊंचाई

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

मुझे पता है तुम पंक्ति ऊंचाइयों बदलने के लिए इस प्रतिनिधि विधि का उपयोग करना होगा:

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

समस्या यह प्रतिनिधि विधि से पहले सेल बनाई गई है कहा जाता है (अर्थात cellForRowAtIndexPath से पहले कहा जाता है) किया जाता है।

तो, मैंने जो सोचा है, वह है viewWillAppear में एक नकली सेल बनाने के लिए और एक विधि जो तालिका दृश्य के डेटा स्रोत (जो मेरे मामले में भी एक सरणी है) में नक्शा की ऊंचाई को जोड़ती है।

viewWillAppear यह एक महत्वपूर्ण तरीका लागू करता ऊंचाई प्राप्त करने के लिए: heightForRowAtIndexPath में फिर

[NSString sizeWithFont: constrainedToSize: lineBreakMode:]

मैं सेल ऊंचाई इतनी तरह वापस कर सकते हैं:

//cellHeights is an ivar populated in viewWillAppear 
return [[cellHeights objectAtIndex:indexPath.row] floatValue]; 

अगर वहाँ एक था मैं सोच रहा था पंक्ति ऊंचाई गतिशील रूप से बदलने के लिए बेहतर तरीका?

मुझे एहसास है कि यह बड़ी संख्या में पंक्तियों (1000 से अधिक, मुझे विश्वास है) के लिए प्रदर्शन को कम कर देगा। लेकिन मेरे मामले में, मेरी पंक्तियां उस संख्या के करीब कभी नहीं आतीं। तो प्रदर्शन हिट नगण्य है।

अग्रिम धन्यवाद!

उत्तर

8

शानदार सवाल! वास्तव में, मैंने अपने कुछ अनुप्रयोगों में कुछ ऐसा ही किया।

मैं कुछ विकल्पों के बारे में सोच सकता हूं, लेकिन ये सभी एक ही विषय के साथ हैं। आप के अंदर sizeWithFont: का उपयोग भी कर सकते हैं और सरणी से दूर कर सकते हैं। उस स्थिति में, यदि आप ऑपरेशन महंगा है, तो आप हर बार आकार को फिर से गणना करने के लिए एक प्रदर्शन हिट ले सकते हैं।

आपheightForRowAtIndexPAth: के अंदर cellHeights सरणी की "आलसी लोड हो रहा है" कर सकता है तो यह कुछ इस तरह दिख सकता है:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if ([cellHeights objectAtIndex:indexPath.row] == nil) { 
     ... calculate height and store it in the array at the correct index... 
    } 

    return [[cellHeights objectAtIndex:indexPath.row] floatValue]; 
} 

लाभ मैं यहाँ सोच रहा हूँ कि आप केवल ऊंचाइयों की गणना करेगा है उन कोशिकाओं के लिए जो निश्चित रूप से लोड होने जा रहे हैं। यदि आप viewWillAppear में गणना करते हैं, तो मुझे लगता है कि आप इसे प्रत्येक सेल के लिए कर रहे हैं, भले ही यह प्रदर्शित हो या नहीं?

अंत में, आप आकार को अपने डेटा मॉडल में ही डाल सकते हैं। यदि यह है, उदाहरण के लिए, तारों की एक सरणी, आप एक वर्ग बना सकते हैं जिसमें दो गुण हैं: एक स्ट्रिंग और "प्रतिनिधित्व आकार" संपत्ति। फिर जब भी स्ट्रिंग का मान बदल जाता है तो आप स्ट्रिंग के आकार को फिर से समझ सकते हैं। फिर, केवल एक सरणी होगी, दो नहीं, जो आपके डेटा स्रोत पर नक्शा रखती हैं, स्ट्रिंग के स्ट्रिंग और डिस्प्ले आकार दोनों युक्त डेटा क्लास से भरे हुए हैं, और स्ट्रिंग में बदलाव होने पर मूल्य की गणना की जाएगी, बिल्कुल नहीं जब दृश्य प्रकट होता है।

वैसे भी, मुझे इन विभिन्न दृष्टिकोणों के बारे में कुछ टिप्पणियां सुनना अच्छा लगेगा।

+0

बहुत बुरा। मैं और भी प्रतिक्रियाओं की उम्मीद कर रहा था। आपके सहयोग के लिए धन्यवाद! –

1

डेटा मॉडल में ऊंचाई डालने का मैथ्यू का विचार दिलचस्प लगता है। यहां एक और जवाब है जो एक बहुत ही समान समाधान का प्रस्ताव करता है: How can I do variable height table cells on the iPhone properly?

1

जब मैं टेबलव्यू (3gs आईफोन पर) स्क्रॉल करता हूं, तो मुझे अपने UITableView में बहुत समस्या है। मैंने बहुत सारे झटके देखे। तो मैं समय प्रोफाइलर खोलता हूं (अनुकूलन के लिए बहुत अच्छा टूल) और समस्या तब होती थी जब मैं फ़ंक्शन आकार WithFont को कॉल करता था। इस समस्या को हल करने का सबसे अच्छा समाधान कन्स्ट्रक्टर में कॉल आकार WithFont है।

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