2013-01-22 23 views
8

मुझे कुछ समस्याएं हैं जो UITableView में गतिशील पंक्ति ऊंचाइयों को लागू करती हैं - लेकिन यह उन कक्षों में नहीं है जिनके साथ मुझे समस्या है, यह सेल के अंदर UILabel है।UILabel में UITableViewCell के साथ गतिशील ऊंचाई

सेल में टेक्स्ट प्रदर्शित करने के लिए केवल एक UILabel शामिल है। मेरी तालिका दृश्य: heightForRowAtIndexPath: एनएसएसटींग के आकार WithFont: विधि का उपयोग कर उस लेबल की ऊंचाई की गणना करके प्रत्येक सेल का सही ढंग से आकार बदल रहा है।

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

यहाँ है कि कैसे मैं कोशिकाओं सेट कर रहा हूं:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ExpandCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    SomeObject *object = self.tableObjects[index.row]; 

    cell.myLabel.text = [object cellText]; 

    [cell.myLabel sizeToFit]; 

    return cell; 
} 

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

मैंने उसी विधि के साथ लेबल फ्रेम की गणना करने का भी प्रयास किया है, जिसमें मैं पंक्ति ऊंचाई की गणना कर रहा हूं, और मुझे वही व्यवहार मिलता है - यह स्क्रीन से स्क्रॉल होने तक और फिर से ठीक से तब तक सही नहीं होता है।

मुझे इसके आसपास काम करने के दो तरीके मिल गए हैं, और न ही स्वीकार्य समाधान हैं।

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

दूसरा कामकाज मेरे लिए बहुत अजीब लगता है - अगर मैं यूआईएलएबल पर डिफ़ॉल्ट सिस्टम फ़ॉन्ट 17 पर फ़ॉन्ट सेटिंग्स छोड़ देता हूं, तो कोशिकाएं स्वयं को सही ढंग से आकर्षित करती हैं। जैसे ही मैं फ़ॉन्ट आकार बदलता हूं, यह स्क्रीन को तब तक सही ढंग से ड्रॉइंग नहीं करने के अपने व्यवहार में बदल जाता है जब तक वह स्क्रीन छोड़ देता है और वापस आ जाता है, या फिर से लोड हो जाता है डेटा तालिका पर कॉल किया जाता है।

मैं इस के साथ किसी भी मदद की सराहना करता हूं।

+0

इस पोस्ट में सही ढंग से अपनी समस्या का जवाब देता है: http://stackoverflow.com/questions/8903369/dynamic- UITableViewCell-ऊंचाई। यदि आप पहले कभी गतिशील रूप से आकार वाले कोशिकाओं को नहीं बनाते हैं, तो यह थोड़ा मुश्किल हो सकता है, लेकिन यह बहुत मुश्किल नहीं है। – macandyp

+0

मुझे समझ में नहीं आता कि उस उत्तर में कोड जो कुछ भी कर रहा है उससे अलग कुछ भी कर रहा है। मैं अपने लेबल के फ्रेम को cellForRowAtIndexPath में सेट कर रहा हूं, लेकिन अगली बार इसे फिर से खींचा जाने तक वह फ्रेम लागू नहीं कर रहा है। या क्या मैं कुछ न कुछ भूल रहा हूं? – alivingston

+0

क्या आप ऊंचाई ForRowAtIndexPath लागू कर रहे हैं? – macandyp

उत्तर

8

मैंने सेलफॉररोएट इंडेक्सपैथ में लेबल को आवंटित/इनिट करके इसे हल किया। मुझे पूरी तरह से यकीन नहीं है कि यह एक समाधान क्यों है - लेकिन ऐसा लगता है कि मुझे जिस समस्या का सामना करना पड़ रहा था, उसमें स्टोरीबोर्ड (या जब, शायद?) सेल के भीतर वस्तुओं को बनाता है। यदि मैं cellForRowAtIndexPath में सेल में लेबल को आवंटित/इनिट करता हूं, तो सबकुछ ठीक से लोड और आकार में होता है।

तो ... मेरा वर्तमान फ़िक्स यह जांचना है कि सेल में मेरा कस्टम लेबल है या नहीं। यदि ऐसा नहीं होता है, तो मैं लेबल को आवंटित/इनिट करता हूं और इसे सेल में डालता हूं। यदि उसके पास एक है, जैसा कि उसके सेल में गिरा दिया गया है, तो मैंने केवल उस लेबल में टेक्स्ट सेट किया है जो पहले से मौजूद है।

सुनिश्चित नहीं है कि इसका सबसे अच्छा समाधान है, लेकिन यह अभी के लिए काम कर रहा है।

+0

मुझे इसी तरह का मुद्दा सामने आया। मैंने टेबल से [cell.myLabel sizeToFit] को हटाकर हल किया है: सेलफोररोएट इंडेक्सपैथ:। और फिर स्टोरीबोर्ड का उपयोग करके, पर्यवेक्षण में टॉप स्पेस, सुपर स्पेस के लिए नीचे की जगह जोड़ें। – jemeshsu

+0

आपने अपना समय बचाया। धन्यवाद – NightFury

3

आईबी में ऑटोसाइजिंग चेकबॉक्स को अनचेक करके मैंने इसका समाधान समाप्त कर दिया। यह अस्पष्ट है कि ऑटो-लेआउट इस समस्या का कारण क्यों बना रहा था।

2

मैं एक ही समस्या से कुचला और मैं वापसी से पहले [cell layoutIfNeeded] बुला सेल द्वारा इसे सुलझाने अंत

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
ExpandCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 
SomeObject *object = self.tableObjects[index.row]; 

cell.myLabel.text = [object cellText]; 

[cell layoutIfNeeded]; 

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