2013-02-21 58 views
18

मेरे पास एक कस्टम UITableViewCell सबक्लास है जिसमें इंटरफ़ेस बिल्डर में ऑटोलायआउट बाधाएं लागू होती हैं। सेल में UITextField सहित कई दृश्य शामिल हैं।हटाए गए UITableViewCell में स्क्रॉल (ऑटोलायआउट का उपयोग करके) तक गलत लेआउट है

प्रासंगिकता से, UITextField का आकार इस तरह से बाधित है कि इसके और अगले दृश्य के बीच डिफ़ॉल्ट क्षैतिज अंतर है।

सेल की तरह instantiated है इस प्रकार है:

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

    cell.textField.text = @"Some string that is different for each cell"; 

    return cell; 
} 

जब सेल पहले प्रकट होता है, UITextField लगने सही फ्रेम, और इसके सही करने के लिए UIView के पीछे दिखाई देता है। हालांकि, जब मैं स्क्रीन से सेल को स्क्रॉल करता हूं, रोकता हूं, और फिर वापस स्क्रॉल करता हूं, तो टेक्स्ट सही ढंग से छोटा कर दिया जाता है।

एक उदाहरण नीचे दिखाया गया है (दूसरे संपादन पर)।

मैंने और [cell setNeedsDisplay] को cellForRowAtIndexPath में सेल के साथ कॉल करने का प्रयास किया है, साथ ही देरी के बाद उन्हें निष्पादित किया है। न तो प्रभावी है।

स्क्रीन को स्क्रॉल करना क्या है जिससे सेल सही तरीके से दिखाई दे रहा है, और मैं या तो इसे कैसे दोहरा सकता हूं या अंतर्निहित समस्या को ठीक कर सकता हूं?

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

आदेश सेल फिर से लोड करने में कॉलिंग

[self.tableView reloadData]; 
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic]; 

, लेआउट सही ढंग से पहली बार प्रकट करने के लिए पैदा करने के लिए प्रकट होता है।

हालांकि, अब यह स्क्रॉल पर टूटता (कभी कभी) (यानी, जब वापस ऊपर स्क्रॉल, लेआउट की कमी अब सही ढंग से लागू नहीं कर रहे हैं)।

[cell setNeedsLayout]cellForRowAtIndexPath पर कॉल करना इस समस्या को ठीक नहीं करता है।

EDIT2:

शीर्ष सेल से पता चला here, सही ढंग से (नीचे सेल करता है) दिखाई दिया जब तक मैं स्क्रीन नीचे स्क्रॉल के रूप में। गायब होने के बाद से।

यह पहली संपादन के रूप में समस्या को दर्शाता है - यह दूसरा प्रतिपादन है कि समस्या (? मुझे लगता है कि यह सेल पुन: उपयोग के साथ कुछ हो सकता है बनाता है)

+0

आप कंसोल में कमी के बारे में कोई चेतावनी हो रही है पर घटना

  • बग का प्रदर्शन का उपयोग करना true
  • है लगता है? – rdelmar

  • +0

    क्या आप कुछ स्क्रीनशॉट शामिल कर सकते हैं? – jrturton

    +0

    @rdelmar मैंने अपनी Autolayout श्रेणी (क्या हमने पहले उस पर चर्चा नहीं की थी?) यदि आप रुचि रखते हैं: http://commandshift.co.uk/blog/2013/02/20/creating-individual-layout-constraints/ – jrturton

    उत्तर

    36

    है आप एक पर एक संपत्ति का नाम तो है UITableViewCell उपclass textLabel या defaultTextLabel, तो आईबी आपके द्वारा निर्दिष्ट बाधाओं को अनदेखा कर देगा और उन्हें बिना किसी चेतावनी के डिफ़ॉल्ट रूप से ओवरराइड करेगा।

    यह आईबी में कस्टम शैली के साथ डिज़ाइन की गई कोशिकाओं पर भी मामला है, जिसमें textLabel या detailTextLabel गुण दिखाई नहीं दे रहे हैं।

    यह भी होता है यदि UIImageView संपत्ति UITableViewCell सबक्लास पर संपत्ति जोड़ें और इसे imageView पर नाम दें।

    +4

    वही "imageView" संपत्ति के लिए भी जाता है। – RickiG

    +4

    इस उत्तर को UITableViewCell क्लास संदर्भ में प्रचारित करने की आवश्यकता है, मैंने बस अपने जीवन के 4 घंटे बर्बाद कर दिए। सुबह 4 बजे ... – atreat

    +0

    आपको बहुत बहुत धन्यवाद। आपने मुझे अपने जीवन के कई घंटे बचाए हैं। –

    4

    इस multiple lines UILabel GitHub issue के अनुसार, यह एक आईओएस बग है।

    मैंने पाया कि आईओएस 9 + में, यह स्थिति अधिकतर अप्रत्याशितता के साथ संपादन मोड में होती है।

    निम्नलिखित कार्यवाही केवल आंशिक रूप से काम करती है: इसे UITableView दो बार फिर से निकालने की आवश्यकता है, और फिर भी सभी परिदृश्यों को कवर नहीं करता है।

    override func viewDidLoad() { 
        super.viewDidLoad() 
    
        tableView.setNeedsLayout() 
        tableView.layoutIfNeeded() 
        tableView.reloadData() 
    } 
    

    नोट्स:

    • UITextView का उपयोग बग के बिना, कई लाइन UILabel करने के लिए एक बढ़िया विकल्प है। UITextViewIULabel अन्य विषमताओं में से कोई भी प्रदर्शित नहीं करता है, जैसे alignment errors या flickering
    • SO-25947146 पर एक वैकल्पिक समाधान भी है, जो मेरे लिए काम नहीं करता है लेकिन उल्लेखनीय है।
    • प्रमुखता से तब होता है जब self.tableView.editing कम मूल्य tableView.estimatedRowHeight के लिए कम कर देता है SwiftArchitect/TableViewControllerRowHeightBug सार