सामग्री फिट करने के लिए UITableView का आकार बदलना


170

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

मैं sizeToFitतालिका के लिए चारों ओर एक काम खोजना चाहूंगा । जहां टेबल का फ्रेम सभी सामग्री की ऊंचाई पर सेट है।

क्या कोई इस बारे में सलाह दे सकता है कि मैं इसे कैसे प्राप्त कर सकता हूं?


OSX पर समान कार्य करने की चाहत रखने वाले किसी व्यक्ति के लिए, इस प्रश्न को देखें: stackoverflow.com/questions/11322139/…
माइकल टेपर

1
@MiMo हाय, क्या आप बता सकते हैं कि "sizeToFit" दृष्टिकोण में क्या गड़बड़ है? :)
iamdavidlam

"मैं चारों ओर एक" sizeToFit "काम ढूंढना चाहूंगा" तो क्या आपने UIView का - sizeToFitतरीका आजमाया है या नहीं ?
स्लिप डी। थॉम्पसन

जवाबों:


155

दरअसल इसका जवाब मुझे खुद ही मिल गया।

मैं सिर्फ एक नया बनाने CGRectके लिए tableView.frameसाथ heightकीtable.contentSize.height

यही कारण है कि की ऊंचाई सेट UITableViewकरने के लिए heightअपनी सामग्री के। चूंकि कोड UI को संशोधित करता है, इसलिए इसे मुख्य धागे में चलाना न भूलें:

dispatch_async(dispatch_get_main_queue(), ^{
        //This code will run in the main thread:
        CGRect frame = self.tableView.frame;
        frame.size.height = self.tableView.contentSize.height;
        self.tableView.frame = frame;
    });

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

वास्तव में आपने ऊँचाई कहाँ निर्दिष्ट की थी? क्या आपने पुनः लोड करने के लिए एक कॉल किया था और उसके बाद उसका आकार बदला था?
जेम्स

27
इस कोड को रखने के लिए सबसे अच्छी जगह कहां है? मैंने इसे डिडीडलॉड में आजमाया और यह संभवत: इसलिए काम नहीं किया क्योंकि टेबलवेट डेलीगेट के तरीकों को अभी तक नहीं हटाया गया था। कौन सी प्रतिनिधि विधि सबसे अच्छी है?
काइल क्लेग

4
मैंने ऐसा किया है viewDidAppear, और यह काम किया है लगता है। ध्यान दें कि टेबलव्यू अपनी सामग्री से थोड़ा लंबा हो सकता है क्योंकि यह एक अनुभाग हेडर और फुटर के लिए थोड़ी जगह छोड़ देता है
जामेओ

2
मैंने पाया कि viewDidAppear सामान आप क्या होने के बाद सभी प्रारंभिक tableView cellForRowAtIndexPath कॉल समाप्त कर दिया है चाहता हूँ डाल करने के लिए एक महान जगह है
rigdonmr

120

KVO, DispatchQueue के बिना 5 और 4.2 समाधान स्विफ्ट, या सेटिंग खुद को विवश करता है।

यह समाधान गुलज़ के उत्तर पर आधारित है ।

1) एक उपवर्ग बनाएँ UITableView:

import UIKit

final class ContentSizedTableView: UITableView {
    override var contentSize:CGSize {
        didSet {
            invalidateIntrinsicContentSize()
        }
    }

    override var intrinsicContentSize: CGSize {
        layoutIfNeeded()
        return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
    }
}

2) UITableViewअपने लेआउट में एक जोड़ें और सभी पक्षों पर बाधाओं को सेट करें। इसका वर्ग निर्धारित करें ContentSizedTableView

3) आपको कुछ त्रुटियां देखनी चाहिए, क्योंकि स्टोरीबोर्ड हमारे उपवर्ग intrinsicContentSizeको ध्यान में नहीं रखता है। आकार निरीक्षक को खोलकर और एक प्लेसहोल्डर मान के आंतरिक आंतरिक ओवरराइड करके इसे ठीक करें। यह डिज़ाइन समय के लिए ओवरराइड है। रनटाइम में यह हमारी ContentSizedTableViewकक्षा में ओवरराइड का उपयोग करेगा


अद्यतन: स्विफ्ट 4.2 के लिए परिवर्तित कोड। यदि आप एक पूर्व संस्करण का उपयोग कर रहे हैं, तो UIViewNoIntrinsicMetricइसके बजाय का उपयोग करेंUIView.noIntrinsicMetric


1
बहुत अच्छा जवाब, इसने मेरे लिए काम किया, धन्यवाद। हालांकि एक बात - मेरे मामले में मुझे स्टोरीबोर्ड में tableViewहोने के वर्ग को बदलने की आवश्यकता थी IntrinsicTableView। मुझे अपनी तालिका दृश्य को दूसरे के भीतर एम्बेड करने की आवश्यकता नहीं थी UIView
DVp.petrov

हां आप ठीक हैं। मैंने अपना उत्तर अपडेट कर दिया। चरण 2 को पढ़ा जा सकता है जैसे आपने कहा। बेशक मैं करने के लिए सेट करने के tableViewलिए थी IntrinsicTableView। इसके अलावा एक अतिरिक्त लपेटना UIViewआवश्यक नहीं है। आप किसी भी मौजूदा मूल दृश्य का उपयोग कर सकते हैं :)
fl034

1
स्विफ्ट 4 यह मेरे लिए ठीक काम कियाtableView.sizeToFit()
सूफ ROCHDI

यदि आपकी सामग्री स्थिर है, तो हाँ यह एक अच्छा समाधान हो सकता है। मेरे दृष्टिकोण से आप अन्य दृश्यों में गतिशील सामग्री के साथ एक तालिका दृश्य को एम्बेड करने के लिए ऑटो-लेआउट का उपयोग कर सकते हैं और इसे हर समय पूरी ऊंचाई पर रख सकते हैं, बिना यह सोचे कि किन जगहों पर sizeToFit()कॉल करने की आवश्यकता है
fl034

2
आश्चर्यजनक, धन्यवाद्!। अंत में टेबलव्यू के लिए पेरेंट और रैप कंटेंट का मिलान करें ...
एम्बर के

79

स्विफ्ट समाधान

इन कदमों का अनुसरण करें:

1- स्टोरीबोर्ड से तालिका के लिए ऊंचाई की सीमा निर्धारित करें।

2- स्टोरीबोर्ड से ऊंचाई की बाधा खींचें और दृश्य नियंत्रक फ़ाइल में इसके लिए @IBOutlet बनाएं।

    @IBOutlet weak var tableHeight: NSLayoutConstraint!

3- फिर आप इस कोड का उपयोग करके तालिका की गतिशीलता के लिए ऊंचाई बदल सकते हैं:

override func viewWillLayoutSubviews() {
    super.updateViewConstraints()
    self.tableHeight?.constant = self.table.contentSize.height
}

अपडेट करें

यदि अंतिम पंक्ति आपके लिए काट दी गई है, तो विलडिसप्ले सेल फ़ंक्शन में viewWillLayoutSubviews () को कॉल करने का प्रयास करें:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    self.viewWillLayoutSubviews()
}

1
मेरे लिए काम किया !! thnx
पुष्पा वाई

5
इस समाधान ने हमेशा मेरे लिए Xcode 8.3 पर अंतिम पंक्ति काट दी।
जेन सी

@ जेक सी: मेरे लिए या तो नहीं
केएमसी

मेरे लिए भी काम किया !!
एंटनी राफेल

1
मुझे इसे cellForRowAtIndexPath: विधि में डालना था। यदि मैं इसे व्यू-लाईआउटआउट साक्षात्कार विधि में रखता हूं, तो गणना की गई सामग्री का आकार ऊँचाई अनुमानित ऊँचाई पर आधारित होता है, न कि वास्तविक सामग्री ऊँचाई पर।
मनु माटेओस

21

मैंने iOS 7 में इसकी कोशिश की है और यह मेरे लिए काम करता है

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.tableView sizeToFit];
}

3
यदि आपका UITableView गतिशील है (जिसका अर्थ है कि सूचना उड़ने पर और उस पर से लोड होती है), तो आपको इसे अन्यत्र डालने की आवश्यकता होगी, न कि दृश्यडालड में। मेरे लिए, मैंने इसे cellForRowAtIndexPath में डाल दिया। पुरानी "प्रॉपर्टी टेबल व्यू नहीं मिली" त्रुटि से बचने के लिए मेरी IBOutlet संपत्ति के नाम पर "tableView" बदलना पड़ा।
jeremytripp

thx, पॉपओवर के अंदर टेबलव्यू का आकार बदलने में समस्या थी, इसने काम किया
Zaporozhchenko Oleksandr

19

तालिका दृश्य पर सामग्री के आकार के लिए एक पर्यवेक्षक जोड़ें, और तदनुसार फ्रेम आकार समायोजित करें

[your_tableview addObserver:self forKeyPath:@"contentSize" options:0 context:NULL];

फिर कॉलबैक में:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
         CGRect frame = your_tableview.frame;
         frame.size = your_tableview.contentSize;
         your_tableview.frame = frame;
    }

आशा है कि यह आपकी मदद करेगा।


2
आपको एक और बात जोड़ना चाहिए। आपको तालिका दृश्य के लिए पर्यवेक्षक को निकालना चाहिए। क्योंकि यह दुर्घटनाग्रस्त हो जाएगा अगर सेल ने निपटा दिया।
महेश अग्रवाल

12

मुझे स्क्रॉल दृश्य के अंदर एक टेबल व्यू था और टेबल व्यू की ऊंचाई की गणना करनी थी और उसी के अनुसार उसका आकार बदलना था। वे कदम मैंने उठाए हैं:

0) अपने स्क्रॉलव्यू में एक यूआईईवीवाई जोड़ें (शायद इस कदम के बिना काम करेगा लेकिन मैंने इसे किसी भी संभावित संघर्ष से बचने के लिए किया था) - यह आपके टेबल व्यू के लिए एक पुनः विचार होगा। यदि आप यह कदम उठाते हैं, तो टेबलव्यू के अधिकार पर विचार सीमाएं निर्धारित करें।

1) UITableView का एक उपवर्ग बनाएँ:

class IntrinsicTableView: UITableView {

    override var contentSize:CGSize {
        didSet {
            self.invalidateIntrinsicContentSize()
        }
    }

    override var intrinsicContentSize: CGSize {
        self.layoutIfNeeded()
        return CGSize(width: UIViewNoIntrinsicMetric, height: contentSize.height)
    }

}

2) स्टोरीबोर्ड में आंतरिक दृश्य के दृश्य में एक तालिका दृश्य का सेट वर्ग: स्क्रीनशॉट: http://joxi.ru/a2XEENpsyBWq0A

3) अपने टेबल व्यू के लिए ऊंचाईकॉन्स्ट्रेंट सेट करें

4) अपनी तालिका के IBoutlet को अपने ViewController तक खींचें

5) अपने व्यू कोंट्रोलर में अपनी टेबल की ऊंचाई के अवरोध को आइबूटलेट खींचें

6) इस विधि को अपने ViewController में जोड़ें:

override func viewWillLayoutSubviews() {
        super.updateViewConstraints()
        self.yourTableViewsHeightConstraint?.constant = self.yourTableView.intrinsicContentSize.height
    }

उम्मीद है की यह मदद करेगा


मेरा जवाब देखें जो आपके उपवर्ग पर आधारित है, लेकिन ऊंचाई की कमी के किसी भी सेटिंग की आवश्यकता नहीं है।
fl034

@ fl034 लिंक प्रदान करते हैं?
गुलज

@ fl034 मुझे नहीं लगता कि आप बाधाओं का उपयोग करने से बच सकते हैं जब आपके तत्व स्क्रॉल दृश्य में एम्बेड किए जाते हैं) मेरा मामला स्क्रॉल दृश्य के साथ है
Gulz

मेरे पास एक स्क्रॉल दृश्य के अंदर मेरा टेबल दृश्य भी है और यह पूरी तरह से काम करता है :)
fl034

iOS 13 / Xcode 11 पर मेरे लिए काम करता है। आपने पीड़ित व्यक्ति के लिए 3 दिन का समय दिया है, धन्यवाद
मेहदी एस।

8

यदि आप तालिका दृश्य की सामग्री आकार को स्वयं ट्रैक करना नहीं चाहते हैं, तो आपको यह उपवर्ग उपयोगी लग सकता है।

protocol ContentFittingTableViewDelegate: UITableViewDelegate {
    func tableViewDidUpdateContentSize(_ tableView: UITableView)
}

class ContentFittingTableView: UITableView {

    override var contentSize: CGSize {
        didSet {
            if !constraints.isEmpty {
                invalidateIntrinsicContentSize()
            } else {
                sizeToFit()
            }

            if contentSize != oldValue {
                if let delegate = delegate as? ContentFittingTableViewDelegate {
                    delegate.tableViewDidUpdateContentSize(self)
                }
            }
        }
    }

    override var intrinsicContentSize: CGSize {
        return contentSize
    }

    override func sizeThatFits(_ size: CGSize) -> CGSize {
        return contentSize
    }
}

1
स्विफ्ट 3 के लिए, आंतरिक रूप से एक override public var intrinsicContentSize: CGSize { //... return someCGSize }
संस्करण

मेरे लिए काम नहीं कर रहा। अभी भी तालिका के नीचे छिपा हुआ है
गुलज़ार

5

यदि आपकी सामग्री सही नहीं है, तो यह सही नहीं है क्योंकि यह अनुमानित रोवराइट (स्वचालित) पर आधारित है, इससे पहले इसका उपयोग करें

tableView.estimatedRowHeight = 0;

स्रोत: https://forums.developer.apple.com/thread/81895


4

स्विफ्ट 3, आईओएस 10.3

समाधान 1: बस डालself.tableview.sizeToFit()मेंcellForRowAt indexPathकार्य करते हैं। टेबलव्यू ऊँचाई सेट करने के लिए सुनिश्चित करें कि आप की जरूरत है। यह एक अच्छा उपाय है यदि आपके पास टेबलव्यू के नीचे के दृश्य नहीं हैं। हालाँकि, यदि आपके पास है, तो नीचे दिया गया टेबलव्यू बाधा अद्यतन नहीं किया जाएगा (मैंने इसे ठीक करने की कोशिश नहीं की क्योंकि मैं समाधान 2 के साथ आया था)

उदाहरण:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCell(withIdentifier: "TestCell", for: indexPath) as? TestCell {
        cell.configureCell(data: testArray[indexPath.row])
        self.postsTableView.sizeToFit()
        return cell
    }

    return UITableViewCell()
}

समाधान 2: स्टोरीबोर्ड में टेबलव्यू ऊँचाई की कसौटी पर सेट करें और इसे ViewController पर खींचें। यदि आप अपने सेल की औसत ऊँचाई जानते हैं और आपको पता है कि आपके सरणी में कितने तत्व हैं, तो आप ऐसा कुछ कर सकते हैं:

tableViewHeightConstraint.constant = CGFloat(testArray.count) * 90.0     // Let's say 90 is the average cell height

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

सभी समाधानों के बाद मैंने कोशिश की और उनमें से प्रत्येक कुछ ठीक कर रहा था, लेकिन पूरी तरह से नहीं, यह वह उत्तर है जो इस समस्या को पूरी तरह से समझाता है और ठीक करता है।


यह बहुत ही सरल उपाय है, इसने मेरे लिए काम किया, थैंक्यू @ डोरेडे नीलोविच
आर। मोहन

1

Mimo का उत्तर और Anooj VM का उत्तर दोनों ही भयानक हैं, लेकिन एक छोटी सी समस्या है यदि आपके पास एक बड़ी सूची है, तो संभव है कि फ्रेम की ऊँचाई आपकी कुछ कोशिकाओं को काट देगी।

इसलिए। मैंने उत्तर को थोड़ा संशोधित किया है:

dispatch_async(dispatch_get_main_queue()) {
    //This code will run in the main thread:
    CGFloat newHeight=self.tableView.contentSize.height;
    CGFloat screenHeightPermissible=(self.view.bounds.size.height-self.tableView.frame.origin.y);
    if (newHeight>screenHeightPermissible)
    {
        //so that table view remains scrollable when 'newHeight'  exceeds the screen bounds
        newHeight=screenHeightPermissible;
    }

    CGRect frame = self.tableView.frame;
    frame.size.height = newHeight;
    self.tableView.frame = frame;
}

1

यदि आप AutoLayout का उपयोग करते हैं, तो ऐसा करने का एक बेहतर तरीका है: ऊंचाई को निर्धारित करने वाले अवरोध को बदलना। बस अपनी तालिका सामग्री की ऊंचाई की गणना करें, फिर बाधा खोजें और इसे बदल दें। यहां एक उदाहरण दिया गया है (यह मानते हुए कि आपकी मेज की ऊंचाई निर्धारित करने वाला अवरोध वास्तव में "समीकरण" के साथ एक ऊंचाई बाधा है:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    for constraint in tableView.constraints {
        if constraint.firstItem as? UITableView == tableView {
            if constraint.firstAttribute == .height {
                constraint.constant = tableView.contentSize.height
            }
        }
    }
}

आप इस पर सुधार कर सकते हैं। अपने टेबलव्यू पर एक अतिरिक्त बाधा जोड़ें, कहते हैं, ऊंचाई <= 10000. इस बाधा को अपने व्यू कंट्रोलर की संपत्ति बनाने के लिए इंटरफ़ेस बिल्डर से अपने .h फ़ाइल में नियंत्रण-ड्रैग का उपयोग करें। तब आप बाधाओं और खोज के माध्यम से पुनरावृत्ति से बच सकते हैं। बस सीधे सेटmyTableHeightConstraint.constant = tableView.contentSize.height
RobP

1

यह मेरे लिए ऑटो लेआउट का उपयोग करके काम करता है, केवल एक सेक्शन के साथ एक टेबल व्यू के साथ।

func getTableViewContentHeight(tableView: UITableView) -> CGFloat {
        tableView.bounds = CGRect(x: 0, y: 0, width: 300, height: 40)
        let rows = tableView.numberOfRows(inSection: 0)
        var height = CGFloat(0)
        for n in 0...rows - 1 {
            height = height + tableView.rectForRow(at: IndexPath(row: n, section: 0)).height
        }
        return height
    }

ऑटो लेआउट सेट करते समय मैं इस फ़ंक्शन को कॉल करता हूं (यहां नमूना SnapKit का उपयोग करता है, लेकिन आपको यह विचार मिलता है):

    let height = getTableViewContentHeight(tableView: myTableView)
    myTableView.snp.makeConstraints {
        ...
        ...
        $0.height.equalTo(height)
    }

मैं चाहता हूं कि यूआईटेबल व्यू केवल कोशिकाओं की संयुक्त ऊंचाई जितना लंबा हो; मैं कोशिकाओं के माध्यम से लूप करता हूं और कोशिकाओं की कुल ऊंचाई को जमा करता हूं। चूंकि इस बिंदु पर तालिका दृश्य का आकार CGRect.zero है, इसलिए मुझे सेल द्वारा परिभाषित ऑटो लेआउट नियमों का सम्मान करने में सक्षम होने के लिए सीमा निर्धारित करने की आवश्यकता है। मैंने आकार को एक मनमाना मूल्य पर सेट किया है जो पर्याप्त बड़ा होना चाहिए। वास्तविक आकार की गणना बाद में ऑटो लेआउट प्रणाली द्वारा की जाएगी।


1

मैंने थोड़ा अलग तरीके से किया, वास्तव में मेरा TableView स्क्रॉलव्यू के अंदर था इसलिए मुझे 0 के रूप में ऊंचाई की बाधा देनी थी।

फिर रनटाइम के दौरान मैंने निम्नलिखित बदलाव किए,

       func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
            self.viewWillLayoutSubviews()
       }
    
       override func viewWillLayoutSubviews() {
            super.updateViewConstraints()
             DispatchQueue.main.async {
               self.tableViewHeightConstraint?.constant = self.myTableView.contentSize.height
               self.view.layoutIfNeeded()
          }
       }

0

अनुज वीएम के जवाब के विस्तार के रूप में, मैं निम्नलिखित का सुझाव देता हूं कि सामग्री के आकार को ताज़ा करने के लिए केवल जब यह बदलता है।

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

- (void)viewDidLoad {
        [super viewDidLoad];
        [self.tableView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:NULL]; 
}


- (void)resizeTableAccordingToContentSize:(CGSize)newContentSize {
        CGRect superviewTableFrame  = self.tableView.superview.bounds;
        CGRect tableFrame = self.tableView.frame;
        BOOL shouldScroll = newContentSize.height > superviewTableFrame.size.height;
        tableFrame.size = shouldScroll ? superviewTableFrame.size : newContentSize;
        [UIView animateWithDuration:0.3
                                    delay:0
                                    options:UIViewAnimationOptionCurveLinear
                                    animations:^{
                            self.tableView.frame = tableFrame;
        } completion: nil];
        self.tableView.scrollEnabled = shouldScroll;
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
    if ([change[NSKeyValueChangeKindKey] unsignedIntValue] == NSKeyValueChangeSetting &&
        [keyPath isEqualToString:@"contentSize"] &&
        !CGSizeEqualToSize([change[NSKeyValueChangeOldKey] CGSizeValue], [change[NSKeyValueChangeNewKey] CGSizeValue])) {
        [self resizeTableAccordingToContentSize:[change[NSKeyValueChangeNewKey] CGSizeValue]];
    } 
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
    [self resizeTableAccordingToContentSize:self.tableView.contentSize]; }

- (void)dealloc {
    [self.tableView removeObserver:self forKeyPath:@"contentSize"];
}

0

मूसा अलमात्री का objc संस्करण

(void)viewWillLayoutSubviews
{
    [super updateViewConstraints];
    CGFloat desiredHeight = self.tableView.contentSize.height;
    // clamp desired height, if needed, and, in that case, leave scroll Enabled
    self.tableHeight.constant = desiredHeight;
    self.tableView.scrollEnabled = NO;
}

0

आप इस रिवाज को आज़मा सकते हैं AGTableView

स्टोरीबोर्ड या प्रोग्रामेटिक रूप से उपयोग करते हुए एक टेबल व्यू ऊँचाई बाधा सेट करने के लिए। (यह वर्ग स्वचालित रूप से एक ऊँचाई की बाधा उत्पन्न करता है और सामग्री दृश्य ऊंचाई को yourtableview ऊंचाई पर सेट करता है)।

class AGTableView: UITableView {

    fileprivate var heightConstraint: NSLayoutConstraint!

    override init(frame: CGRect, style: UITableViewStyle) {
        super.init(frame: frame, style: style)
        self.associateConstraints()
    }

    required public init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.associateConstraints()
    }

    override open func layoutSubviews() {
        super.layoutSubviews()

        if self.heightConstraint != nil {
            self.heightConstraint.constant = self.contentSize.height
        }
        else{
            self.sizeToFit()
            print("Set a heightConstraint to Resizing UITableView to fit content")
        }
    }

    func associateConstraints() {
        // iterate through height constraints and identify

        for constraint: NSLayoutConstraint in constraints {
            if constraint.firstAttribute == .height {
                if constraint.relation == .equal {
                    heightConstraint = constraint
                }
            }
        }
    }
}

नोट यदि कोई समस्या है तो ऊँचाई सेट करने के लिए yourTableView.layoutSubviews()


0

Fl034 के उत्तर के आधार पर । लेकिन Xamarin.iOS उपयोगकर्ताओं के लिए:

    [Register("ContentSizedTableView")]
    public class ContentSizedTableView : UITableView
    {
        public ContentSizedTableView(IntPtr handle) : base(handle)
        {
        }

        public override CGSize ContentSize { get => base.ContentSize; set { base.ContentSize = value; InvalidateIntrinsicContentSize(); } }
        public override CGSize IntrinsicContentSize
        {
            get
            {
                this.LayoutIfNeeded();
                return new CGSize(width: NoIntrinsicMetric, height: ContentSize.Height);
            }
        }
    }

0

मेरा स्विफ्ट 5 कार्यान्वयन तालिका के हाईट अवरोध को इसकी सामग्री ( contentSize.height) के आकार में सेट करना है । यह विधि मानती है कि आप ऑटो लेआउट का उपयोग कर रहे हैं। इस कोड को cellForRowAtटेबल व्यू पद्धति के अंदर रखा जाना चाहिए ।

tableView.heightAnchor.constraint(equalToConstant: tableView.contentSize.height).isActive = true

-1

यदि आप चाहते हैं कि आपकी तालिका गतिशील हो, तो आपको ऊपर दी गई तालिका के आधार पर समाधान का उपयोग करने की आवश्यकता होगी। यदि आप बस एक छोटी सी तालिका प्रदर्शित करना चाहते हैं, तो आप एक कंटेनर दृश्य का उपयोग कर सकते हैं और उसमें एक UITableViewController एम्बेड कर सकते हैं - कंटेनर आकार के अनुसार UITableView का आकार बदल दिया जाएगा।

यह लेआउट के लिए बहुत सी गणना और कॉल से बचा जाता है।


1
शब्द का उपयोग न करें aboveक्योंकि उत्तर को फेरबदल किया जा सकता है।
निक कोव

-3

स्विफ्ट 3 में इसके लिए म्यू सोल्यूशन : इस तरीके को कॉल करेंviewDidAppear

func UITableView_Auto_Height(_ t : UITableView)
{
        var frame: CGRect = t.frame;
        frame.size.height = t.contentSize.height;
        t.frame = frame;        
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.