2012-10-13 19 views
5

में UI ऑब्जेक्ट के फ्रेम को अपडेट नहीं किया जा सकता है मेरे पास उप-वर्गीकृत UITableViewCell है।UITableViewCell

मुझे गतिशील रूप से UILabel के फ्रेम को बदलने की आवश्यकता है।

यहाँ मैं क्या किया है है:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"messageCell"; 
    MessageCell *cell = (MessageCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    cell.Content.Text = @"Content!"; 
    [cell.Content setFrame:CGRectMake(0, 0, 10, 10)]; 
} 

UILabel का पाठ इतना बदल यह एक IBOutlet मुद्दा नहीं है करता है। फ्रेम हालांकि आईबी में परिभाषित जैसा ही बना हुआ है।

मैं इस तरह सामान किया है तो इससे पहले कि मैं वास्तव में यकीन है कि गलत यहाँ क्या हो गया था नहीं कर रहा हूँ ...

किसी भी मदद के लिए धन्यवाद।

संपादित करें:

मैं viewDidLoad

में

[self.tableView registerNib:[UINib nibWithNibName:@"MessageCell" bundle:nil] 
    forCellReuseIdentifier:@"MessageCell"]; 

का उपयोग

उत्तर

4

खैर कुछ दिनों के इनाम पोस्टिंग के बाद मैं इस सवाल का जवाब मिल गया है, मुझे आशा है कि यह किसी को किसी दिन में मदद मिलेगी ...

मैं 100% नहीं हूँ यकीन है कि क्यों, लेकिन क्या मैं बस नहीं कर सकते करने की कोशिश की किया जाना चाहिए:

यदि आप इंटरफ़ेस बिल्डर के माध्यम से इसे डाल चुके हैं तो आप किसी ऑब्जेक्ट के फ्रेम को नहीं बदल सकते हैं।

परिवर्तन करने के लिए मैं जो करना चाहता था, मैंने बस इन ऑब्जेक्ट्स को "subitWithCoder" के अंदर प्रोग्राम किया।

content = [[UILabel alloc] initWithFrame:CGRectMake(120, 100, 200, 50)]; 
content.opaque = NO; 
content.numberOfLines = 0; 
[self.contentView addSubview:content]; 

मैं तो फ्रेम के अंदर बदलने में सक्षम था "- (शून्य) layoutSubviews" (लेकिन मूल रूप से कहीं भी मैं चाहता था)

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 
    [cell.Content setFrame:CGRectMake(0, 0, 10, 10)]; 

    ... 
2

कुछ गलत वहाँ होना चाहिए।

प्रयास करें, सिर्फपरीक्षण के लिए इस लागू करने के लिए:

tableView:willDisplayCell:forRowAtIndexPath: 

तरह

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    MessageCell* aCell = (MessageCell*)cell; 
    aCell.Content.Text = @"Content!"; 
    [aCell.Content setFrame:CGRectMake(0, 0, 10, 10)]; 
} 

परिणाम क्या है?

+0

वही दुर्भाग्यपूर्ण रहता है ... – BenB

+0

ग्रेट डैनियल यह मेरे लिए काम करता है। अंत में आपने एक बहुत ही ज्ञात समस्या का समाधान दिया। –

1

cell.Content पर एक सबव्यू जोड़ें और सामग्री के बजाय उस सबव्यू का आकार बदलें। सेल को हमेशा आपके टेबल व्यू में फिट करने के लिए बढ़ाया जाएगा ताकि आप इसे छोटा न बना सकें।
(और निश्चित रूप से सेल ऊंचाई को छोटे बनाने के लिए tableView:heightForRowAtIndexPath:)

+0

मैंने सेल के दृश्य को संपादित करने का प्रयास नहीं किया, लेकिन उस सेल के अंदर एक UILabel। – BenB

1

यह सेल का पुन: उपयोग करने के तथ्य से संबंधित हो सकता है। इस

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     static NSString *CellIdentifier = @"messageCell"; 
     MessageCell *cell = (MessageCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
    if(cell == nil) 
     { 
     cell = [[[MessageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]autorelease]; 
     } 
     cell.Content.Text = @"Content!"; 
     [cell.Content setFrame:CGRectMake(0, 0, 10, 10)]; 
     return cell; 
    } 
+0

ऐप कभी नहीं पहुंचता है (सेल == शून्य) ... – BenB

+0

क्या आपने अपने टेबलव्यू के डेटासोर्स को सेट किया है? ऐप द्वारा आपका मतलब क्या नहीं है (सेल == शून्य), सेलफॉररोएट इंडेक्सपैथ कहलाता है? – Animesh

+0

मेरा मतलब है कि सेल कभी शून्य नहीं है – BenB

1

आप अपने कस्टम सेल (अर्थात MessageCell) में - (void) layoutSubviews विधि अधिभावी विचार करें और क्या वहाँ में अपना सामान लेआउट आज़माएं? मुझे लगता है कि लेआउट बदलने वाले कोड को रखने के लिए यह सबसे सुरक्षित स्थान है, क्योंकि अन्य स्थानों पर इसका कोई प्रभाव नहीं पड़ सकता है। layoutSubviews के कार्यान्वयन में [super layoutSubviews]; पर कॉल करना न भूलें।

इस दृष्टिकोण के साथ जाने पर विचार करें और हमें बताएं कि यह आपके लिए काम करता है या नहीं! लेकिन आपको इस दृष्टिकोण के साथ प्रदर्शन प्रभावों पर विचार करने की आवश्यकता है, क्योंकि layoutSubviews प्रत्येक बार तालिका स्क्रॉल कहलाएगा।

संपादित करें:

layoutSubviews अंदर अपने लेबल के लिए सही फ्रेम आकार के लिए समायोजित करने के लिए फ्रेम गणना के लिए - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode का उपयोग कर पर विचार करें।

+0

अभी भी कोई परिणाम नहीं मिल रहा है ... मैंने सुनिश्चित किया है कि ओवरस्ड लेआउट संदेश संदेश में सबव्यूव्यू कहा जा रहा है, और मैंने सुपर फ़ंक्शन – BenB

+0

भी कहा है एक और बहुत अजीब प्रयास: "- (शून्य) सेटफ्रेम: (सीजीईजीईटी) फ्रेम" विधि को ओवरराइड करें आपके MessageCell.m में (एक बार फिर से सुपर कॉल करें) और वहां एनएसएलओजी कथन डालें ताकि यह देखने के लिए कि तालिका दृश्य के दौरान इसे रेड्रा चक्र कहा जाता है! –

+0

और मेरे शुरुआती उत्तर के बारे में एक और सवाल: आपके ओवरराइड "लेआउट सबव्यूव्स" विधि में, जब आप "[सुपर लेआउट सबव्यूव्यू]" कहते हैं? आपके लेबल के लिए फ्रेम सेट करने के बाद कॉल को सुपर पर डालने का प्रयास करें। –

2

आप xib के माध्यम से बनाया यूआई वस्तु के फ्रेम संपादित नहीं कर सकते, तो autolayout चालू है ऐसा करने के दो तरीके हैं:

  1. उस xib के लिए ऑटोलायआउट अक्षम करें।

या

विशेष NSlayout बाधा के लिए यह तदनुसार देते हैं
  1. बनाओ एक IBOutlet और कोड के माध्यम से अपनी लगातार संपत्ति के मूल्य को अद्यतन करने और भूल नहीं है वस्तु पर उचित रूप से layOutIfNeeded कॉल करने के लिए जिस पर कार्यान्वयन के अनुसार कॉन्स्टारिंट लागू किया गया है या पर्यवेक्षण किया गया है।