2011-06-07 20 views
14

के साथ परिवर्तन IITableView सेल में टेक्स्ट फ़ील्ड की स्थिति की गणना करने के लिए cell.contentView.bounds.size.width का उपयोग करता हूं। जब सेल बनाया जाता है, डीबग कोड चौड़ाई को 302 के रूप में रिपोर्ट करता है। जब सेल स्क्रीन से स्क्रॉल करता है और फिर वापस चालू होता है, तो डीबग कोड रिपोर्ट करता है कि यह 280 है - हर बार। ऐसा लगता है कि यह 302 पर वापस नहीं जाना चाहता है और 280 पर अटक गया है। शुद्ध परिणाम यह है कि टेक्स्ट फ़ील्ड को दूसरी जगह फ़ील्ड को सेल की सामग्री में डाल दिया जाता है, हालांकि इसे देखा गया था, हालांकि इसे पहली बार सही जगह।UITableView cell.contentView.bounds.size.width सेल रीयूज

मुझे लगता है कि 22 किसी भी तरह महत्वपूर्ण है, लेकिन मुझे नहीं पता कि यह क्या है। अनुमान लगाया जा सकता है कि यह प्रकटीकरण तीर हो सकता है, मैंने चौड़ाई निर्धारण के सामने "सेल साफ़ करें" कोड को स्थानांतरित किया, जिसमें नाडा के सहायक को सेट करना शामिल था।

क्या कोई मुझे बता सकता है कि यहां क्या हो रहा है?

(- मैं के बारे में पता है कि - अप्रासंगिक साथ सामान बाहर कतरना) कोड इस तरह दिखता है:

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 

    NSUInteger section = [indexPath section]; 
    NSUInteger row = [indexPath row]; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    } 


    // Configure the cell. 

    while([cell.contentView.subviews count]){ 
     id subview = [cell.contentView.subviews objectAtIndex:0]; 
     [subview removeFromSuperview]; 
    } 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

8< snip! 

    CGFloat theCellWidth = cell.contentView.bounds.size.width - 44.0; 
    CGFloat theLineHeight = [[UIFont boldSystemFontOfSize: [UIFont labelFontSize]+1.0] lineHeight]; 

    NSLog(@"cell.contentView.bounds.size.width %1.0f",cell.contentView.bounds.size.width); 

    if (0==section) { 
     switch (row) { 
      case 2: 
       while([cell.contentView.subviews count]){ 
        id subview = [cell.contentView.subviews objectAtIndex:0]; 
        [subview removeFromSuperview]; 
       } 
       cell.selectionStyle = UITableViewCellSelectionStyleNone; 
       cell.textLabel.text = @" "; 
       cell.detailTextLabel.text = @"The Age"; 
       theAgeTextField.frame = CGRectMake(10.0, 2.0, theCellWidth, theLineHeight); 
//    NSLog(@"cell.contentView %@",cell.contentView); 
       theAgeTextField.text = theAge; 
       theAgeTextField.font = [UIFont boldSystemFontOfSize: [UIFont labelFontSize]+1.0]; 
       theAgeTextField.keyboardType = UIKeyboardTypeDecimalPad; 
       theAgeTextField.borderStyle = UITextBorderStyleNone; 
       theAgeTextField.userInteractionEnabled = NO; 
       [cell.contentView addSubview:theAgeTextField]; 
       cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
       break; 

8< snip! (lots of closing braces and other stuff omitted) 

    return cell; 
} 

घर, लड़कों और लड़कियों पर इस एक कोशिश करना चाहते हैं?

एक नए नेविगेशन-आधारित एप्लिकेशन के साथ शुरू करें। RootViewController.m में निम्नलिखित कोड डालें:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return 5; 
} 

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    NSLog(@"cell.contentView.bounds.size.width %1.0f",cell.contentView.bounds.size.width); 
    // Configure the cell. 
    return cell; 
} 

ऐसा करने के लिए आवश्यक डिफ़ॉल्ट कोड में केवल दो बदलाव हैं: अनुभाग में पंक्तियों की संख्या को बदलने ("वापसी 5") और की शैली सेल होना चाहिए UITableViewCellStyleSubtitle। तब, जब आप इस कार्यक्रम चलाने के लिए, आप इस के पांच लाइनों देखेंगे:

2011-06-18 11:10:19.976 TestTableCells[7569:207] cell.contentView.bounds.size.width 302 
2011-06-18 11:10:19.978 TestTableCells[7569:207] cell.contentView.bounds.size.width 302 
2011-06-18 11:10:19.979 TestTableCells[7569:207] cell.contentView.bounds.size.width 302 
2011-06-18 11:10:19.980 TestTableCells[7569:207] cell.contentView.bounds.size.width 302 
2011-06-18 11:10:19.982 TestTableCells[7569:207] cell.contentView.bounds.size.width 302 

खींचें कुछ कोशिकाओं स्क्रीन बंद (ऊपर खींचें - नीचे कुछ भी नहीं है) और जब वे फिर से प्रकट होना, तो आप इस मिल :

2011-06-18 11:10:24.013 TestTableCells[7569:207] cell.contentView.bounds.size.width 320 
2011-06-18 11:10:24.047 TestTableCells[7569:207] cell.contentView.bounds.size.width 320 
2011-06-18 11:10:24.130 TestTableCells[7569:207] cell.contentView.bounds.size.width 320 

सच कहूं, मैं इस के साथ बिल्ली के रूप में निराश हूँ, और इसलिए बहुत (, एक काम एप्लिकेशन के बिना भी) $ 99 टट्टू करने के लिए परीक्षा रहा हूँ तो मैं एप्पल पर किसी को इस पर में वजन हो सकता है।

किसी को भी कोई विचार है कि यहां क्या हो रहा है?

धन्यवाद!


कुछ और दिलचस्प देखना चाहते हैं?

NSString *CellIdentifier = [NSString stringWithFormat: @"%d", arc4random() ]; 

    NSLog(@"%@",CellIdentifier); 

अब, हर बार, लॉग में चौड़ाई है हमेशा 302. यह प्रतीत होता है, तो, एक पुन: उपयोग सेल मूल सेल की तुलना में अलग सामग्री की चौड़ाई है: static NSString... लाइन के स्थान पर इस प्रयास करें ।

फिर ... सोच रहा है ... किसी को कोई सुराग मिला है?

+0

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

उत्तर

10

मुझे संदेह है कि आप जो देख रहे हैं वह सेल के एक्सेसरी व्यू को बदलने के कारण है, जो अगली बार जब सेल -layoutSubviews करता है तो सामग्री दृश्य का आकार बदल जाएगा। ऐसा तब होना चाहिए जब कक्ष तालिका में जोड़ा जाता है लेकिन तब तक सामग्री दृश्य की सीमा अपडेट नहीं की जाएगी।

भले ही मुझे नहीं पता कि यह एक मुद्दा क्यों होगा। आप केवल theAgeTextField की चौड़ाई निर्धारित करने के लिए चिंतित हैं, इसलिए यदि आप इसे सामग्री दृश्य की वर्तमान चौड़ाई के अनुरूप उचित रूप से आकार देते हैं और इसे autoresizingMask झंडे को लचीला चौड़ाई देने के लिए सेट करते हैं तो इसे आवश्यकतानुसार बढ़ने या घटाने चाहिए सामग्री दृश्य परिवर्तन।

यदि आपको अधिक विस्तृत लेआउट व्यवहार की आवश्यकता है तो यह संभवतः UITableViewCell सबक्लास के भीतर होना चाहिए। सेल और इसके सबव्यूज़ को कस्टमाइज़ करने के अवसरों के लिए -prepareForReuse और -layoutSubviews देखें। आपका डेटासोर्स आपके सेल उप-वर्ग के उदाहरण के लिए theAge पास करने में सक्षम होना चाहिए और यह प्रदर्शित नहीं किया जाएगा कि यह कैसे प्रदर्शित किया जाएगा।

+1

जो मैंने कोड किया है उसके प्रकाश में मैंने जो लिखा है उसे पचाना होगा। समस्या यह है कि टेक्स्ट फ़ील्ड में टेक्स्ट बाएं सिरे पर काटा जा रहा है। किसी भी मामले में, उदाहरण के साथ मैंने इस पोस्ट को संपादित किया है (जो एक्सेसरी- और टेक्स्ट फ़ील्ड-फ्री है) और देखें कि आप क्या सोचते हैं। – BillEccles

0

आप पंक्ति प्रतिनिधि विधि के लिए ऊंचाई को लागू करने और वहाँ

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

// do math 

return newheight; 
} 

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

+0

क्या आप कृपया बता सकते हैं कि सेल चौड़ाई और सेल की सामग्री क्यों देखें चौड़ाई समान नहीं है? –

+0

क्योंकि सेल में कुछ और विचार हैं, और एक्सेसर टैग, जैसे डिलीट, आगे बढ़ें, फिर से ऑर्डर करें, चेक करें और कुछ और, इसलिए सामग्री दृश्य पूर्ण चौड़ाई नहीं होनी चाहिए। कोई भी ऐसा करने से आपको प्रतिबंधित नहीं कर रहा है, लेकिन यदि आप टेबलव्यू के डिफ़ॉल्ट व्यवहार को चाहते हैं तो आपके पास कुछ चीजों को ध्यान में रखना होगा। लेकिन यदि आप पृष्ठभूमि छवि या रंग चाहते हैं तो आप आसानी से पृष्ठभूमि दृश्य सेट कर सकते हैं। –

1

मैं एक ही चीज़ में भाग गया, सिवाय इसके कि ऑफ़सेट 22 के बजाय 20 था। मुझे लगता है कि जोना का जवाब सही रास्ते पर है, लेकिन एक त्वरित कामकाज के लिए जो सेल.contentView.frame/bounds के आकार बदलने वाले व्यवहार से बचाता है सेल की सामग्री के भीतर विचारों को बिछाने के लिए मेरे संदर्भ के रूप में इस्तेमाल किया गया सेल.फ्रेम/सीमाएं देखें।

+1

एक और बात: मैंने पाया कि यह केवल मेरे लिए हो रहा था जब कोशिकाओं को टेबल शैली UITableViewStyleGrouped के साथ प्रदर्शित किया गया था। यदि तालिका शैली UITableViewStylePlain थी, cell.contentView.bounds.size.width नहीं बदला था। – jay492355

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