2009-09-21 12 views
5

मैं UITableViewDelegate के बजाय सेल के अंदर से मेरी तालिका दृश्य कक्षों का आकार बदलना चाहता हूं। मैं एसिंक्रोनस सामग्री के आधार पर उनका आकार बदल रहा हूं, इसलिए मैं उन्हें प्रतिनिधि में आकार नहीं दे सकता।क्या UITableViewDelegate का उपयोग किये बिना UITableViewCell का आकार बदलना संभव है?

मैंने सेल के अंदर self.frame सेट करने का प्रयास किया, लेकिन तालिका दृश्य वास्तव में इसके बारे में नाखुश था। कोशिकाएं ओवरलैपिंग थीं और सभी प्रकार की पागलपन चल रही थी।

उत्तर

5

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

मुझे नहीं पता कि यह व्यावहारिक क्यों नहीं है। आपके पास चलने वाले एसिंच सिस्टमों की संख्या हो सकती है जो टेबल व्यू प्रतिनिधि द्वारा आयोजित केंद्रीय ऊंचाई कैश को अपडेट करते हैं - हर बार जब आप कोई सेल बनाते हैं तो आप इसे प्रतिनिधि के रूप में प्रतिनिधि को असाइन कर सकते हैं ताकि उसे टेबल पर वापस बात करने का तरीका हो और चलो यह पता है कि कोशिकाओं को पुनः लोड करने की आवश्यकता है और नई ऊंचाइयों क्या हैं।

यदि आप इसके बारे में सोचते हैं, तो खराब तालिका दृश्य एक स्क्रॉल व्यू है जिसे इन सभी अलग-अलग कोशिकाओं का प्रबंधन करना होता है और उन्हें दृष्टि से एक साथ रखना होता है - इसलिए यह एक सेल की बदमाश होने के लिए वास्तव में निर्दयी है और टेबल को दिए बिना फ्रेम को बदलना शुरू कर देता है देखें कि वैसे भी क्या हो रहा है। टेबल ड्राइव को छोड़ना और इसे बताएं कि क्या करना है।

+0

हाँ, यदि आप [tableView reloadData] को कॉल करते हैं तो यह प्रतिनिधि विधि 'tableView: heightForRow: atIndexPath: को कॉल करेगा: जहां आपके पास अपने डेटा के आधार पर उपयुक्त सेल ऊंचाई की गणना करने का मौका है। हालांकि, ध्यान रखें कि यदि आपके पास बहुत लंबी कोशिकाएं हैं या उनमें से बहुत सारे हैं तो स्क्रॉलिंग प्रदर्शन के मामले में यह महंगा हो सकता है। – runmad

+0

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

+1

कनाडा डे के सुझाव के अनुसार, आपको [tableView reloadData] को कॉल करने की आवश्यकता नहीं है। इसके बजाय, आप [tableView startUpdates] को कॉल कर सकते हैं; [tableView endUpdates]; जो प्रत्येक सेल को पुनः लोड किए बिना तालिका को प्रत्येक सेल को फिर से मापने के लिए दृश्य करेगा (कॉल ऊंचाईफॉरफोरो: atIndexPath: प्रत्येक सेल के लिए)। – TomSwift

0

आप के बजाय कोशिकाओं ही फ्रेम यहाँ एक संदर्भ, कोशिकाओं contentView propertys फ्रेम का प्रबंधन करने के लिए प्रयास करना चाहिए http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/contentView

+0

मैं सामग्री दृश्य में विचार जोड़ रहा हूं। मैं 'self.contentView.frame' के बजाय' self.frame' का आकार बदल रहा हूं क्योंकि सामग्री स्वत: रीसाइजिंग मास्क के साथ स्वतः-आकार बदलती है। किसी भी तरह से, 'self.view' या' self.contentView' के फ्रेम को सेट करने से समस्या ठीक नहीं होती है। यदि आप इसे सेल के अंदर से आकार देते हैं तो तालिका दृश्य अभी भी उलझन में है। –

1

नहीं, आप UITableViewDelegate का उपयोग किये बिना सेल के आकार को सेट नहीं कर सकते हैं। वास्तव में सेल के आकार को बदलने के साथ सेल के आकार को बदलना, लेकिन यह ऑफसेट को बदल नहीं देगा जो UITableView कोशिकाओं को आकर्षित करता है। जिसके परिणामस्वरूप ओवरलैप हो जाएगा, और पूरे स्थान पर अंतराल होगा।

आपका मित्र tableView:heightForRowAtIndexPath: है, और यह तेज होना चाहिए। यदि आप इसे ओवरराइड करते हैं, तो तालिका दृश्य अब यह धारणा नहीं कर सकता कि सभी पंक्तियां समान ऊंचाई के हैं। और इस प्रकार यह सभी पंक्तियों को उनकी ऊंचाई के लिए प्रत्येक बार जब यह कोशिकाओं को आकर्षित करने के लिए पूछता है।

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