6

मैं परिवर्तनीय ऊंचाई कस्टम तालिका कक्षों के साथ एक UITableView का निर्माण कर रहा हूं, उनकी ऊंचाई एक निहित बहु-लाइन UILabel के आकार द्वारा निर्धारित की गई है। मुझे tableView:heightForRowAtIndexPath: प्रतिनिधि विधि तारित हुई है और sizeWithFont:constrainedToSize: का उपयोग करके अंतिम ऊंचाई को सही तरीके से गणना कर रही है।UITableViewCell फ्रेम ऊंचाई तालिका से मेल नहीं खाती दृश्य: heightForRowAtIndexPath:

मैंने अजीब मुद्दे पर चलाया है: उस समय तक डेटा स्रोत विधि tableView:cellForRowAtIndexPath: कहा जाता है, सही प्रति पंक्ति ऊंचाई ऊपर वर्णित अनुसार पहले ही निर्धारित की जा चुकी है, लेकिन सेल का फ्रेम उस ऊंचाई से मेल नहीं खाता है। इसके बजाय, frame.size.height सेल की संपत्ति तालिका दृश्य की डिफ़ॉल्ट सेल ऊंचाई है (86 पीएक्स, जैसा कि मैंने इसे इंटरफ़ेस बिल्डर में सेट किया है, सही ऊंचाई जब निहित UILabel में टेक्स्ट की केवल एक पंक्ति है), बजाय ऊंचाई tableView:heightForRowAtIndexPath: उस सूचकांक पथ के लिए निर्धारित सही है।

मैं dequeuing का उपयोग कर cellForRowAtIndexPath: में कोशिकाओं का निर्माण कर रहा हूँ, कि है,

// Using storyboards, this never returns nil, no need to check for it 
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"SomeIdentifier"]; 
NSLog(@"%f", cell.frame.size.height); // 86, not correct if the cell contains a multi-line UILabel 

ऐसा लगता है, तो, कि जो कुछ भी आईओएस पर्दे के पीछे क्या कर रहा है, dequeuing सेल के फ्रेम संपत्ति की स्थापना नहीं कर रहा है गणना की ऊंचाई से मेल खाते हैं। यह अपने आप में आश्चर्यजनक नहीं है, सेल उदाहरणों के साथ खुद को चिंतित करते हैं, न कि उनकी ज्यामिति। कोशिकाओं को सही ढंग से प्रस्तुत किया जाता है, हालांकि, ऊंचाई संपत्ति कहीं सेट की जा रही है, लेकिन यह cellForRowAtIndexPath: के बाद होती है।

तो: जब मैं प्रारंभ में तालिका दृश्य को पॉप्युलेट करता हूं, तो cell.frame.size.height सभी कोशिकाओं के लिए 86 है क्योंकि जब वे सूची को नीचे स्क्रॉल करते हैं तो पहली बार दिखाई देते हैं। चूंकि सही ज्यामिति को प्रदर्शित होने से पहले प्रत्येक पंक्ति के लिए पहले cellForRowAtIndexPath: के बाद कुछ समय के बाद सेट किया जाता है, जब मैं बैक अप करता हूं, तो ऊंचाई की संपत्ति प्रत्येक सेल के लिए सही होती है जो पुन: उपयोग किए जाने के बाद वापस आती है।

इसके बाद मैं इच्छा पर आगे और पीछे तालिका दृश्य को स्क्रॉल कर सकता हूं, और उस बिंदु से प्रत्येक सेल के लिए ऊंचाई संपत्ति सही रहती है।

किसी भी डेक्यू-आधारित पुन: उपयोग से पहले, सही सेल ऊंचाई को पहली बार प्राप्त करने का सही तरीका क्या है? मुझे टेबल सेल के सबव्यूज़ की पुनः स्थिति बनाने के लिए इसकी आवश्यकता है। क्या मुझे को मैन्युअल रूप से cellForRowAtIndexPath: पर कॉल करने की आवश्यकता है और उसके बाद उस ऊंचाई से मेल खाने के लिए ताज़ा बनाए गए कस्टमसेल उदाहरण के फ्रेम को मैन्युअल रूप से सेट करें? यह अनावश्यक प्रतीत होता है, और मुझे यह पता लगाने के लिए एक तंत्र बनाने की आवश्यकता होगी कि सेल को पहली बार गलत फ्रेम ऊंचाई बनाम बनाते समय बनाया जाए जब इसे इस अनावश्यकता से बचने के लिए सही फ्रेम ऊंचाई के साथ हटा दिया जाता है।

तो, अगर कोई इसके पीछे तर्क के बारे में कुछ प्रकाश डाल सकता है, तो मैं इसकी सराहना करता हूं।

उत्तर

6

जैसा कि फ्लेक्सो द्वारा सुझाया गया है, इसका जवाब यह है कि प्रश्न में एक संपादन जोड़ने से स्पष्ट रूप से बेहतर है। तो, यहां पिछले संपादन को उत्तर के रूप में दिया गया है:


कभी नहीं, मुझे दस्तावेज़ों को बेहतर ढंग से पढ़ना चाहिए। मैं UITableViewDelegate की विधि में सही फ्रेम प्राप्त कर सकता हूं, इसलिए यह सही दृश्य सेट पर निर्भर करता है जो सही फ्रेम सेट पर निर्भर करता है, cellForRowAtIndexPath: पर निर्भर करता है।

दिलचस्प है कि डॉक्स इस, हालांकि कहते हैं:

delegate रिटर्न के बाद, तालिका दृश्य सेट केवल alpha और frame गुण, और उसके बाद ही जब पंक्तियों एनिमेट के रूप में वे अंदर या बाहर स्लाइड।

... चूंकि इस प्रतिनिधि विधि को कॉल करते समय सही फ्रेम पहले से ही मौजूद है। लेकिन वैसे भी, समस्या हल हो गई।

+0

प्रारंभिक प्रश्न वास्तव में अच्छा है, लेकिन यह उत्तर बहुत अच्छा नहीं है। यह साझा करने की देखभाल कि आपने समस्या को कैसे ठीक किया? – botbot

0

यह मत भूलना कि सेल UIView है, इसलिए layoutSubviews ओवरराइड करना सही फ्रेम प्राप्त करने और सबव्यू के आकार/स्थिति को समायोजित करने का एक वैध तरीका भी है। बस [super layoutSubviews] पर कॉल करना न भूलें।

0

सेल पर कोई भी सेटअप करने से पहले मुझे सबसे आसान तरीका मिला cell.layoutIfNeeded() पर कॉल करना था। यह सुनिश्चित करता है कि सभी लेआउट बाधाओं की गणना की जाती है और फ्रेम सेट होते हैं।

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