UITableView डायनेमिक सेल हाइट कुछ स्क्रॉलिंग के बाद ही सही हो जाती है


117

मेरे पास ऑटो लेआउट का उपयोग करके एक स्टोरीबोर्ड में परिभाषित UITableViewएक कस्टम के साथ है UITableViewCell। सेल में कई मल्टीलाइन होते हैं UILabels

UITableViewप्रकट होता है ठीक से कैलकुलेट सेल ऊंचाइयों पर है, लेकिन पहले कुछ कोशिकाओं है कि ऊंचाई ठीक से लेबल के बीच विभाजित नहीं है के लिए। थोड़ा स्क्रॉल करने के बाद, सब कुछ उम्मीद के मुताबिक काम करता है (यहां तक ​​कि कोशिकाएं जो शुरू में गलत थीं)।

- (void)viewDidLoad {
    [super viewDidLoad]
    // ...
    self.tableView.rowHeight = UITableViewAutomaticDimension;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    TableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"TestCell"];
    // ...
    // Set label.text for variable length string.
    return cell;
}

क्या ऐसा कुछ है जो मुझे याद आ रहा है, जिसके कारण ऑटो लेआउट पहले कुछ समय में अपना काम नहीं कर सकता है?

मैंने एक नमूना परियोजना बनाई है जो इस व्यवहार को प्रदर्शित करती है।

नमूना परियोजना: पहले लोड पर नमूना परियोजना से तालिका के शीर्ष। नमूना परियोजना: नीचे और ऊपर स्क्रॉल करने के बाद समान कोशिकाएं।


1
मैं भी इस मुद्दे का सामना कर रहा हूं, लेकिन नीचे दिए गए जवाब मेरे लिए काम नहीं कर रहे हैं, इस पर कोई मदद
शांगरी सी

1
एक ही मुद्दे का सामना करना पड़ रहा है लेआउट जोड़ने सेल के लिए अगर मुझे भी काम नहीं करता है? किसी भी अधिक सुझाव
मैक्स

1
शानदार स्पॉट। यह 2019 में अभी भी एक समस्या है: /
फेटी

मैंने पाया कि निम्नलिखित लिंक में मुझे क्या मदद मिली - यह चर ऊंचाई तालिका दृश्य कोशिकाओं की एक बहुत व्यापक चर्चा है: stackoverflow.com/a/18746930/826946
एंडी वीनस्टीन

जवाबों:


139

मुझे नहीं पता कि यह स्पष्ट रूप से प्रलेखित है या नहीं, लेकिन [cell layoutIfNeeded]सेल लौटने से पहले जोड़ना आपकी समस्या को हल करता है।

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    TableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"TestCell"];
    NSUInteger n1 = firstLabelWordCount[indexPath.row];
    NSUInteger n2 = secondLabelWordCount[indexPath.row];
    [cell setNumberOfWordsForFirstLabel:n1 secondLabel:n2];

    [cell layoutIfNeeded]; // <- added

    return cell;
}

3
मुझे आश्चर्य है कि, यह केवल पहली बार ही क्यों आवश्यक है? यह ठीक वैसे ही काम करता है जैसे मैं -layoutIfNeededसेल में सेल में डालता हूं -awakeFromNib। मैं केवल कॉल करना पसंद करूंगा layoutIfNeededजहां मुझे पता है कि यह क्यों आवश्यक है।
ब्लैकपैन

2
मेरे लिए काम किया! और मुझे यह जानना अच्छा लगेगा कि इसकी आवश्यकता क्यों है!
मुस्तफा

काम नहीं किया अगर आप आकार वर्ग प्रस्तुत करते हैं, कि किसी भी एक्स से अलग
आंद्रेई कॉन्स्टेंटिनोव

@AndreyKonstantinov यह आकार वर्ग के साथ काम नहीं करता है, मैं इसे आकार वर्ग के साथ कैसे काम कर सकता हूं?
z22

यह आकार वर्ग के बिना काम करता है, आकार वर्ग के साथ कोई समाधान?
युवराजसिंह

38

यह मेरे लिए तब काम आया जब अन्य समान समाधान नहीं हुए:

override func didMoveToSuperview() {
    super.didMoveToSuperview()
    layoutIfNeeded()
}

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


1
स्वीकार किए गए उत्तर से बेहतर है क्योंकि यह केवल तब कहा जाता है जब सेल को प्रत्येक सेल डिस्प्ले के बजाय xib से लोड किया जा रहा हो। कोड की बहुत कम लाइनें।
रॉबर्ट वागस्टाफ

3
कॉल करना न भूलेंsuper.didMoveToSuperview()
cicerocamargo

@cicerocamargo Apple के बारे में कहते हैं didMoveToSuperview: "इस पद्धति का डिफ़ॉल्ट कार्यान्वयन कुछ नहीं करता है।"
इवान स्मेटनिन

4
@IvanSmetanin यह कोई फर्क नहीं पड़ता कि डिफ़ॉल्ट कार्यान्वयन कुछ भी नहीं करता है, आपको अभी भी सुपर विधि को कॉल करना चाहिए क्योंकि यह वास्तव में भविष्य में कुछ कर सकता है।
TNguyen

(बस btw आपको निश्चित रूप से उस फोन पर सुपर कॉल करना चाहिए। मैंने कभी ऐसा प्रोजेक्ट नहीं देखा है, जहां टीम समग्र रूप से एक से अधिक बार सेल नहीं करती है, इसलिए, निश्चित रूप से आपको उन सभी को चुनना सुनिश्चित करना होगा। अलग मुद्दा सिर्फ तुम क्या TNguyen कहा)।
fattie

22

जोड़ना [cell layoutIfNeeded]उन cellForRowAtIndexPathकोशिकाओं के लिए काम नहीं करता है, जिन्हें शुरू में आउट-ऑफ-व्यू स्क्रॉल किया जाता है।

न ही इसके साथ प्रीफ्रेशिंग करता है [cell setNeedsLayout]

आपको अभी भी कुछ कोशिकाओं को स्क्रॉल करना होगा और उन्हें सही तरीके से आकार देने के लिए वापस देखना होगा।

यह बहुत निराशाजनक है क्योंकि अधिकांश देवों के पास डायनामिक प्रकार, ऑटोलेयआउट और सेल्फ-सिजिंग सेल ठीक से काम कर रहे हैं - इस कष्टप्रद मामले को छोड़कर। यह बग मेरे सभी "लम्बे" टेबल व्यू कंट्रोलर्स को प्रभावित करता है।


मेरे लिए भी वैसा ही। जब मैं पहली बार स्क्रॉल करता हूं, तो सेल का आकार 44px होता है। यदि मैं सेल को दृष्टि से बाहर करने और वापस आने के लिए स्क्रॉल करता हूं, तो यह ठीक से आकार का है। क्या आपको कोई समाधान मिला?
अधिकतम

धन्यवाद @ ashy_32bit ने इसे मेरे लिए भी हल कर दिया।
ImpurestClub

यह एक सादा बग, @Scenario सही प्रतीत होगा? भयानक सामान।
फेटी

3
[cell layoutSubviews]लेआउट के बजाय का उपयोग करना । यदि संभव हो तो ठीक किया जा सकता है। देखें stackoverflow.com/a/33515872/1474113
ypresto

14

मुझे अपनी एक परियोजना में समान अनुभव था।

ऐसा क्यों होता है?

सेल को स्टोरीबोर्ड में कुछ डिवाइस के लिए चौड़ाई के साथ डिज़ाइन किया गया है। उदाहरण के लिए 400px। उदाहरण के लिए आपके लेबल की चौड़ाई समान है। जब यह स्टोरीबोर्ड से लोड होता है तो इसकी चौड़ाई 400px होती है।

यहाँ एक समस्या है:

tableView:heightForRowAtIndexPath: सेल लेआउट से पहले इसे बुलाया जाता है।

तो इसने 400px चौड़ाई के साथ लेबल और सेल के लिए ऊँचाई की गणना की। लेकिन आप स्क्रीन के साथ डिवाइस पर चलते हैं, उदाहरण के लिए, 320px। और यह स्वचालित रूप से गणना की गई ऊंचाई गलत है। सिर्फ इसलिए कि सेल layoutSubviewsतभी होती है tableView:heightForRowAtIndexPath: जब आप preferredMaxLayoutWidthअपने लेबल के लिए मैन्युअल रूप से सेट करते हैं तब भी layoutSubviewsइसमें मदद नहीं मिलती है।

मेरा समाधान:

1) उपवर्ग UITableViewऔर ओवरराइड dequeueReusableCellWithIdentifier:forIndexPath:। सेल चौड़ाई को टेबल की चौड़ाई के बराबर सेट करें और सेल के लेआउट को मजबूर करें।

- (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [super dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
    CGRect cellFrame = cell.frame;
    cellFrame.size.width = self.frame.size.width;
    cell.frame = cellFrame;
    [cell layoutIfNeeded];
    return cell;
}

2) उपवर्ग UITableViewCellpreferredMaxLayoutWidthअपने लेबल के लिए मैन्युअल रूप से सेट करें layoutSubviews। इसके अलावा, आपको मैन्युअल रूप से लेआउट की आवश्यकता है contentView, क्योंकि यह सेल फ़्रेम परिवर्तन के बाद स्वचालित रूप से लेआउट नहीं करता है (मुझे नहीं पता कि क्यों, लेकिन यह है)

- (void)layoutSubviews {
    [super layoutSubviews];
    [self.contentView layoutIfNeeded];
    self.yourLongTextLabel.preferredMaxLayoutWidth = self.yourLongTextLabel.width;
}

1
जब मैं इस मुद्दे पर भागा, तो मुझे यह भी सुनिश्चित करने की आवश्यकता थी कि टेबलव्यू का फ्रेम सही था, इसलिए मैंने टेबलव्यू (आबादी के अनुसार) देखने से पहले [self.tableview LayoutIfNeeded] को फोन किया।
जीके

मैंने कभी नहीं सोचा कि यह गलत चौड़ाई के साथ करना था। cell.frame.size.width = tableview.frame.widthतब समारोह cell.layoutIfNeeded()में cellForRowAtमेरे लिए चाल
चली

10

मुझे एक समान समस्या है, पहले लोड पर, पंक्ति की ऊंचाई की गणना नहीं की गई थी, लेकिन कुछ स्क्रॉलिंग के बाद या किसी अन्य स्क्रीन पर जाएं और मैं इस स्क्रीन पर वापस आ जाता हूं पंक्तियों की गणना की जाती है। पहले लोड पर मेरे आइटम को इंटरनेट से लोड किया जाता है और दूसरे लोड पर मेरे आइटम को पहले कोर डेटा से लोड किया जाता है और इंटरनेट से पुनः लोड किया जाता है और मैंने देखा कि इंटरनेट से पुनः लोड होने पर पंक्तियों की ऊंचाई की गणना की जाती है। इसलिए मैंने देखा कि जब टेबल व्यू.reloadData () सेग एनीमेशन के दौरान कॉल किया जाता है (पुश और वर्तमान सेग्यू के साथ एक ही समस्या), पंक्ति की ऊंचाई की गणना नहीं की गई थी। इसलिए मैंने व्यू इनिशियलाइज़ेशन में टेबलव्यू को छिपा दिया और यूज़र को बदसूरत प्रभाव को रोकने के लिए एक एक्टिविटी लोडर रखा और 300ms के बाद टेबल व्यू.रेलोडडाटा को कॉल किया और अब समस्या हल हो गई है। मुझे लगता है कि यह एक UIKit बग है, लेकिन यह वर्कअराउंड ट्रिक बनाता है।

मैंने अपने आइटम लोड पूरा करने वाले हैंडलर में थीस लाइन्स (स्विफ्ट 3.0) डाल दी

DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(300), execute: {
        self.tableView.isHidden = false
        self.loader.stopAnimating()
        self.tableView.reloadData()
    })

यह समझाता है कि कुछ लोगों के लिए, लेआउट में पुनः लोडडाटा डालें क्योंकि साक्षात्कार समस्या को हल करते हैं


यह एकमात्र WA है जिसने मेरे लिए भी काम किया है। सिवाय मैं उपयोग नहीं करता है, लेकिन डेटा स्रोत को जोड़ने पर तालिका के अल्फा को 0 पर सेट करें, फिर पुनः लोड करने के बाद 1 तक।
PJ_Finnegan

6

उपर्युक्त समाधानों में से कोई भी मेरे लिए काम नहीं करता है, जो काम किया है वह एक जादू का नुस्खा है: उन्हें इस क्रम में कॉल करें:

tableView.reloadData()
tableView.layoutIfNeeded() tableView.beginUpdates() tableView.endUpdates()

मेरे टेबल व्यू डेटा को एक वेब सेवा से लिया जाता है, कनेक्शन के कॉल बैक में मैं उपरोक्त लाइनें लिखता हूं।


1
स्विफ्ट 5 के लिए यह संग्रह दृश्य में भी काम करता है, भगवान आपको आशीर्वाद दे, भाई।
गोवानी ध्रुव विजयकुमार

मेरे लिए, इसने सेल की सही ऊँचाई और लेआउट लौटा दिया, लेकिन इसमें इसका कोई डेटा नहीं था
डैरो हार्टमैन

उन लाइनों के बाद setNeedsDisplay () आज़माएं
Jahelia

5

मेरे मामले में जब पहली बार सेल प्रदर्शित किया गया था तो यूआईबेल की अंतिम पंक्ति को काट दिया गया था। यह बहुत बेतरतीब ढंग से हुआ और इसे सही तरीके से आकार देने का एकमात्र तरीका था सेल को दृश्य से बाहर स्क्रॉल करना और उसे वापस लाना। मैंने अब तक दिखाए गए सभी संभावित समाधानों की कोशिश की (लेआउटआईएनडीड..रेलोडडाटा) लेकिन मेरे लिए कुछ भी काम नहीं किया। चाल सेट करने के लिए था "AutoShrink" करने के लिए Minimuum फ़ॉन्ट स्केल (मेरे लिए 0.5)। कोशिश करो


यह मेरे लिए काम कर रहा है, ऊपर सूचीबद्ध किसी भी अन्य समाधान को लागू किए बिना। शानदार खोज।
मैकिजम

2
लेकिन यह पाठ को स्वत: स्फूर्त करता है ... कोई तालिका दृश्य में पाठ के विभिन्न आकार क्यों लेना चाहेगा? बहुत भयानक लग रहा है।
लुसी डेग्रे सेप

5

तालिका दृश्य कस्टम सेल में सभी सामग्री के लिए एक बाधा जोड़ें, फिर तालिका दृश्य पंक्ति की ऊँचाई का अनुमान लगाएं और एक दृश्य भार में स्वचालित आयाम के साथ पंक्ति ऊँचाई सेट करें:

    override func viewDidLoad() {
    super.viewDidLoad()

    tableView.estimatedRowHeight = 70
    tableView.rowHeight = UITableViewAutomaticDimension
}

उस प्रारंभिक लोडिंग समस्या को ठीक करने के लिए, एक कस्टम टेबल व्यू सेल में लेआउटइफाइड विधि लागू करें:

class CustomTableViewCell: UITableViewCell {

override func awakeFromNib() {
    super.awakeFromNib()
    self.layoutIfNeeded()
    // Initialization code
}
}

estimatedRowHeightमान को सेट करना महत्वपूर्ण है > 0 और नहीं UITableViewAutomaticDimension(जो -1 है), अन्यथा ऑटो पंक्ति ऊंचाई काम नहीं करेगी।
PJ_Finnegan

5

मैंने इस सवाल के अधिकांश जवाबों की कोशिश की है और उनमें से किसी को भी काम करने के लिए नहीं मिला है। एकमात्र कार्यात्मक समाधान मुझे मिला जो मेरे UITableViewControllerउपवर्ग में निम्नलिखित को जोड़ना था :

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    UIView.performWithoutAnimation {
        tableView.beginUpdates()
        tableView.endUpdates()
    }
}

UIView.performWithoutAnimationकॉल के लिए आवश्यक है, अन्यथा आप दृश्य नियंत्रक भार के रूप में सामान्य तालिका दृश्य एनीमेशन देखेंगे।


काम करना और निश्चित रूप से दो बार पुनः लोड करने से बेहतर है
जिमी जॉर्ज थॉमस

2
काला जादू। ऐसा करना viewWillAppearमेरे लिए काम नहीं करता था, लेकिन में यह कर रहा viewDidAppearथा।
मार्टिन

जब दृश्य में कार्यान्वित किया गया तो मेरे लिए यह समाधान 'काम' था। यह किसी भी तरह से उपयोगकर्ता के अनुभव के लिए इष्टतम नहीं है क्योंकि तालिका आकार सही होने पर तालिका सामग्री चारों ओर कूद जाती है।
richardpiazza

अद्भुत मैं उदाहरणों की एक बहुत कोशिश की है, लेकिन विफल रहता है आप दानव हैं
शकील अहमद

@ मार्टिन के रूप में भी
एजे


3

बुला cell.layoutIfNeeded()अंदर cellForRowAtios 10 और ios 11 पर मेरे लिए काम किया, लेकिन ios 9 पर नहीं।

ios 9 पर भी यह काम पाने के लिए, मैं फोन करता हूं cell.layoutSubviews()और इसने यह काम किया है।


2

अपने संदर्भ के लिए स्क्रीनशॉट को आकर्षित करनामेरे लिए इनमें से किसी भी दृष्टिकोण ने काम नहीं किया, लेकिन मुझे पता चला कि लेबल Preferred Widthका इंटरफ़ेस बिल्डर में एक स्पष्ट सेट था। उस को हटाना ("स्पष्ट" अनचेक करना) और फिर UITableViewAutomaticDimensionअपेक्षित रूप से काम करना।


2

मैंने इस पृष्ठ के सभी समाधानों की कोशिश की, लेकिन उपयोग वर्गों को अनचेक करने के बाद फिर से जाँचने से मेरी समस्या हल हो गई।

संपादित करें: आकार की कक्षाओं को अनचेक करने से स्टोरीबोर्ड पर बहुत सारी समस्याएं होती हैं इसलिए मैंने एक और समाधान की कोशिश की। मैंने अपने दृश्य नियंत्रक viewDidLoadऔर viewWillAppearविधियों में अपनी तालिका दृश्य को आबाद किया । इससे मेरी समस्या हल हो गई।


1

मेरे पास लेबल को आकार देने के साथ समस्या है इसलिए मैंने केवल
टेक्स्ट सेट करने के बाद chatTextLabel.text = chatMessage.message chatTextLabel? .UpdateConstraints () करने का प्रयास किया है।

// पूर्ण कोड

func setContent() {
    chatTextLabel.text = chatMessage.message
    chatTextLabel?.updateConstraints()

    let labelTextWidth = (chatTextLabel?.intrinsicContentSize().width) ?? 0
    let labelTextHeight = chatTextLabel?.intrinsicContentSize().height

    guard labelTextWidth < originWidth && labelTextHeight <= singleLineRowheight else {
      trailingConstraint?.constant = trailingConstant
      return
    }
    trailingConstraint?.constant = trailingConstant + (originWidth - labelTextWidth)

  }

1

मेरे मामले में, मैं दूसरे चक्र में अपडेट कर रहा था। इसलिए लेबलटेक्स्ट सेट होने के बाद टेबल व्यू ऊंचाई को अपडेट किया गया। मैंने async ब्लॉक को हटा दिया।

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCell(withIdentifier:Identifier, for: indexPath) 
     // Check your cycle if update cycle is same or not
     // DispatchQueue.main.async {
        cell.label.text = nil
     // }
}

मैं भी एक async ब्लॉक है, लेकिन यह आवश्यक है? क्या कोई विकल्प नहीं है?
नजर मेडीरोस

1

बस सुनिश्चित करें कि आप टेबल व्यू के 'विलिसप्लेसेल' प्रतिनिधि विधि में लेबल टेक्स्ट सेट नहीं कर रहे हैं। गतिशील ऊंचाई गणना के लिए 'cellForRowAtindexPath' प्रतिनिधि विधि में लेबल टेक्स्ट सेट करें।

आपका स्वागत है :)


1

मेरे मामले में, सेल में एक स्टैक दृश्य समस्या पैदा कर रहा था। यह स्पष्ट रूप से एक बग है। एक बार मैंने इसे हटा दिया, तो समस्या हल हो गई।


1
मैंने अन्य सभी समाधानों की कोशिश की, आपके समाधान ने इसे साझा करने के लिए धन्यवाद के लिए काम किया
tamtoum1987

1

समस्या यह है कि प्रारंभिक सेल लोड होने से पहले हमारे पास एक मान्य पंक्ति ऊंचाई है। जब दृश्य प्रकट होता है तो वर्कअराउंड टेबल पुनः लोड करने के लिए बाध्य होता है।

- (void)viewDidAppear:(BOOL)animated
{
  [super viewDidAppear:animated];
  [self.tableView reloadData];
}

यह अब तक सबसे बेहतर समाधान था जिससे मुझे मदद मिली। इसने 100% सेल को सही नहीं किया, लेकिन 80% तक अपना वास्तविक आकार ले रहे थे। बहुत बहुत धन्यवाद
TheTravloper

1

IOS 12+ के लिए केवल 2019 के बाद ...

Apple के सामयिक विचित्र अक्षमता का एक निरंतर उदाहरण है, जहां समस्याओं का शाब्दिक वर्षों से चल रहा है।

ऐसा लगता है कि मामला है

        cell.layoutIfNeeded()
        return cell

इसे ठीक कर देंगे। (आप निश्चित रूप से कुछ प्रदर्शन खो रहे हैं।)

ऐसा है Apple के साथ जीवन।


0

मेरे मामले में, प्रारंभिक तालिका दृश्य लोड होने के बाद सेल की ऊँचाई के साथ समस्या होती है, और एक उपयोगकर्ता कार्रवाई होती है (सेल में एक बटन पर टैप करना जिसमें सेल ऊंचाई को बदलने का प्रभाव होता है)। जब तक मैं नहीं करता मैं अपनी ऊँचाई को बदलने के लिए सेल प्राप्त करने में असमर्थ रहा:

[self.tableView reloadData];

मैंने कोशिश की

[cell layoutIfNeeded];

लेकिन वह काम नहीं किया।


0

स्विफ्ट 3. में मुझे हर बार पुन: प्रयोज्य सेल के पाठ को अपडेट करने के लिए self.layoutIfNeeded () कॉल करना पड़ता था।

import UIKit
import SnapKit

class CommentTableViewCell: UITableViewCell {

    static let reuseIdentifier = "CommentTableViewCell"

    var comment: Comment! {
        didSet {
            textLbl.attributedText = comment.attributedTextToDisplay()
            self.layoutIfNeeded() //This is a fix to make propper automatic dimentions (height).
        }
    }

    internal var textLbl = UILabel()

    override func layoutSubviews() {
        super.layoutSubviews()

        if textLbl.superview == nil {
            textLbl.numberOfLines = 0
            textLbl.lineBreakMode = .byWordWrapping
            self.contentView.addSubview(textLbl)
            textLbl.snp.makeConstraints({ (make) in
                make.left.equalTo(contentView.snp.left).inset(10)
                make.right.equalTo(contentView.snp.right).inset(10)
                make.top.equalTo(contentView.snp.top).inset(10)
                make.bottom.equalTo(contentView.snp.bottom).inset(10)
            })
        }
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let comment = comments[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: CommentTableViewCell.reuseIdentifier, for: indexPath) as! CommentTableViewCell
        cell.selectionStyle = .none
        cell.comment = comment
        return cell
    }

commentsTableView.rowHeight = UITableViewAutomaticDimension
    commentsTableView.estimatedRowHeight = 140

0

उपरोक्त समाधानों में से किसी ने भी काम नहीं किया लेकिन सुझावों के निम्नलिखित संयोजन ने किया।

ViewDidLoad () में निम्नलिखित जोड़ना था।

DispatchQueue.main.async {

        self.tableView.reloadData()

        self.tableView.setNeedsLayout()
        self.tableView.layoutIfNeeded()

        self.tableView.reloadData()

    }

रीलोडेटा, सेटनिड्स लाइएट और लेआउट के उपरोक्त संयोजन ने काम किया लेकिन किसी अन्य ने नहीं। हालांकि इस परियोजना में कोशिकाओं के लिए विशिष्ट हो सकता है। और हाँ, इसे काम करने के लिए दो बार पुनः लोडडाउन करना पड़ा।

इसके अलावा viewDidLoad में निम्नलिखित सेट करें

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = MyEstimatedHeight

TableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) में

cell.setNeedsLayout()
cell.layoutIfNeeded() 

मेरा समान reloadData/beginUpdates/endUpdates/reloadDataभी काम कर रहा है; दूसरी बार बुलाया reloadData जाना चाहिए। इसे में लपेटने की जरूरत नहीं है async
किरण

0

मैं इस मुद्दे पर भागा और अपना दृश्य / लेबल इनिशियलाइज़ेशन कोड FROM tableView(willDisplay cell:)TO चलाकर इसे ठीक किया tableView(cellForRowAt:)


जो सेल को इनिशियलाइज़ करने का अनुशंसित तरीका नहीं है। willDisplayसे बेहतर प्रदर्शन होगा cellForRowAt। अंतिम सेल का उपयोग केवल सही सेल को प्रेरित करने के लिए करें।
मार्टिन

2 साल बाद, मैं उस पुरानी टिप्पणी को पढ़ रहा हूं जिसे मैंने लिखा था। यह एक बुरी सलाह थी। यहां तक कि अगर willDisplayबेहतर प्रदर्शन किया है, उस में अपने सेल यूआई आरंभ करने के लिए सिफारिश की है cellForRowAtजब लेआउट स्वचालित है। दरअसल, लेआउट UIKit देकर की गई है के बाद cellForRowAt एट से पहले willDisplay। इसलिए यदि आपकी सेल की ऊँचाई उसकी सामग्री पर निर्भर करती है, तो लेबल सामग्री (या जो भी हो) को प्रारंभ करें cellForRowAt
मार्टिन

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


//  call the method dynamiclabelHeightForText
}

उपरोक्त विधि का उपयोग करें जो पंक्ति के लिए ऊंचाई को गतिशील रूप से लौटाता है। और उसी डायनेमिक ऊंचाई को उस लैबल को असाइन करें जिसे आप उपयोग कर रहे हैं।

-(int)dynamiclabelHeightForText:(NSString *)text :(int)width :(UIFont *)font
{

    CGSize maximumLabelSize = CGSizeMake(width,2500);

    CGSize expectedLabelSize = [text sizeWithFont:font
                                constrainedToSize:maximumLabelSize
                                    lineBreakMode:NSLineBreakByWordWrapping];


    return expectedLabelSize.height;


}

यह कोड आपको लेबल में प्रदर्शित पाठ के लिए गतिशील ऊंचाई खोजने में मदद करता है।


वास्तव में रमेश, यह तब तक की जरूरत नहीं होनी चाहिए जब तक कि tableView.estimatedRowHeight और tableView.rowHeight = UITableViewAutomaticDimension गुण सेट नहीं हो जाते। इसके अलावा, सुनिश्चित करें कि कस्टम सेल में विभिन्न विजेट्स और कंटेंट व्यू पर उपयुक्त बाधाएं हैं।
बोनांजाड्राइवर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.