সামগ্রীতে ফিট করার জন্য ইউআইটিএবলভিউকে পুনরায় আকার দিন


170

আমি এমন একটি অ্যাপ তৈরি করছি যাতে একটি প্রশ্ন থাকবে UILabelএবং এতে একাধিক পছন্দ উত্তর প্রদর্শিত হবে UITableView, প্রতিটি সারিতে একাধিক পছন্দ দেখানো হবে। প্রশ্নোত্তরগুলি পৃথক হবে, তাই UITableViewউচ্চতাতে গতিশীল হওয়ার জন্য আমার এটি দরকার ।

আমি sizeToFitটেবিলের চারপাশে একটি কাজ খুঁজে পেতে চাই । যেখানে টেবিলের ফ্রেমটি সমস্ত সামগ্রীর উচ্চতায় সেট করা আছে।

আমি কীভাবে এটি অর্জন করতে পারি সে সম্পর্কে কেউ পরামর্শ দিতে পারেন?



1
@ মাইমো হাই, আপনি কি "সাইজটিফিট" পদ্ধতির সাথে কী ভুল তা ব্যাখ্যা করতে পারেন দয়া করে? :)
iamdavidlam

"আমি আশেপাশে একটি" সাইজটোফিট "কাজটি খুঁজতে চাই । সুতরাং আপনি বা ইউআইভিউ - sizeToFitপদ্ধতির চেষ্টা করে দেখেন নি ?
স্লিপ ডি থম্পসন

উত্তর:


155

আসলে আমি উত্তরটি নিজেই পেয়েছি।

আমি শুধু একটি নতুন তৈরি CGRectজন্য tableView.frameসঙ্গে heightএরtable.contentSize.height

যে উচ্চতা সেট করে UITableViewকরতে heightএর সমস্ত সামগ্রী। যেহেতু কোডটি ইউআইকে সংশোধন করে, তাই এটি মূল থ্রেডে চালাতে ভুলবেন না:

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
এই পদ্ধতিতে সমস্যাগুলি চালানো সম্ভব। আপনার যদি একটি বড় তালিকা থাকে তবে এটি সম্ভব যে ফ্রেমের উচ্চতাটি আপনার কয়েকটি ঘর কেটে ফেলবে। আপনি যদি অস্থির করে সক্ষম হয়ে থাকেন এবং কিছু কক্ষকে দর্শন ছাড়তে না যেতে দেখতে নীচে স্ক্রোল করেন তবে আপনি এটি ঘটতে পারবেন।
কেন

আপনি উচ্চতাটি কোথায় নির্দিষ্ট করেছেন? আপনি কি পুনরায় লোড ডেটা এবং এডওয়ার্ডগুলি পুনরায় আকার দেওয়ার জন্য একটি কল করেছেন?
জেমস

27
এই কোডটি দেওয়ার সবচেয়ে ভাল জায়গাটি কোথায়? আমি এটি ভিডিডলয়েডে চেষ্টা করেছি এবং এটি সম্ভবত কার্যকর হয়নি কারণ টেবিলভিউ প্রতিনিধি পদ্ধতিগুলি এখনও বহিস্কার হয়নি। কোন প্রতিনিধি পদ্ধতি সবচেয়ে ভাল?
কাইল Clegg

4
আমি এটি ভিডিড অ্যাপয়ার করেছিলাম এবং মনে হয় এটি কার্যকর হয়েছে। নোট করুন যে টেবিলভিউটি এর সামগ্রীর চেয়ে কিছুটা লম্বা হতে পারে কারণ এটি বিভাগের শিরোনাম এবং পাদচরণের জন্য কিছুটা জায়গা ছেড়ে দেয়
জামেও

2
আমি খুঁজে পেয়েছি যে সমস্ত প্রাথমিক টেবিলভিউ সেলফরউআউটআইডেক্সপথ কলগুলি শেষ হওয়ার পরে আপনি যা করতে চান তার জন্য রাখার জন্য ভিডিডিঅায়ার একটি দুর্দান্ত জায়গা
রিডডনমর

120

কেভিও, ডিসপ্যাচকিউ, বা সেটিং নিজেকে সীমাবদ্ধ না করে সুইফ্ট 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ক্লাসে ওভাররাইড ব্যবহার করবে


আপডেট: সুইফট ৪.২ এর জন্য পরিবর্তিত কোড। আপনি যদি পূর্ব সংস্করণ ব্যবহার করেন তবে এর UIViewNoIntrinsicMetricপরিবর্তে ব্যবহার করুনUIView.noIntrinsicMetric


1
খুব ভাল উত্তর, এটি আমার জন্য কার্যকর, ধন্যবাদ। যদিও একটি জিনিস - আমার ক্ষেত্রে আমার স্টোরিবোর্ডে tableViewথাকার ক্লাসটি পরিবর্তন করা দরকার IntrinsicTableView। আমার টেবিলের ভিউটিকে অন্যের মধ্যে এম্বেড করার দরকার নেই UIView
ডিভিপি.পেট্রভ 25'18

হ্যাঁ তুমি সঠিক. আমি আমার উত্তর আপডেট। পদক্ষেপ 2 আপনি যেমন বলেছিলেন তা পড়তে পারা যায়। অবশ্যই আমি সেট করতে tableViewচেয়েছিলাম IntrinsicTableView। এছাড়াও একটি অতিরিক্ত মোড়ানো UIViewপ্রয়োজন হয় না। আপনি অবশ্যই যে কোনও বিদ্যমান প্যারেন্ট ভিউ ব্যবহার করতে পারেন :)
fl034

1
সুইফট 4 এটি আমার পক্ষে ঠিক কাজ করেছেtableView.sizeToFit()
সউফ রওচডিআই

হ্যাঁ এটি যদি আপনার বিষয়বস্তু স্থির থাকে তবে একটি ভাল সমাধান হতে পারে। আমার পদ্ধতির সাহায্যে আপনি অ্যাট-লেআউটটি ব্যবহার করতে পারেন কোনও টেবিল ভিউটিকে অন্যান্য দৃশ্যে গতিশীল সামগ্রী সহ এম্বেড করতে এবং কোনও স্থানে কী sizeToFit()ডাকা প্রয়োজন তা ভেবে ভেবেই পুরো সময় এটি পুরো উচ্চতায় রাখতে পারেন
fl034

2
দারুণ, আপনাকে ধন্যবাদ!. অবশেষে পিতামাতার সাথে মেলে এবং টেবিল ভিউয়ের জন্য সামগ্রী মোড়ানো ...
আম্বার কে

79

সুইফট সলিউশন

এই পদক্ষেপগুলি অনুসরণ করুন:

1- স্টোরিবোর্ড থেকে টেবিলের জন্য উচ্চতার সীমাবদ্ধতা সেট করুন।

2- স্টোরিবোর্ড থেকে উচ্চতার সীমাবদ্ধতা টানুন এবং ভিউ কন্ট্রোলার ফাইলটিতে এটির জন্য @ আইবিআউটলেট তৈরি করুন।

    @IBOutlet weak var tableHeight: NSLayoutConstraint!

3- তারপরে আপনি এই কোডটি ব্যবহার করে টেবিলের গতিবেগের জন্য উচ্চতা পরিবর্তন করতে পারেন:

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

হালনাগাদ

যদি আপনার জন্য শেষ সারিটি কেটে ফেলা হয় তবে উইলডেলআউটউবভিউগুলি () উইলডায়াল সেল ফাংশনটিতে কল করার চেষ্টা করুন:

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

1
আমার জন্য কাজ করেছেন !! thnx
পুষ্প ওয়াই

5
এই সমাধানটি সর্বদা আমার জন্য Xcode 8.3 এ শেষ সারিটি কেটে দেয়।
জেন সি

@ জেক সি: আমার পক্ষেও নয়
কেএমসি

আমার জন্যও কাজ করেছেন !!
অ্যান্টনি রাফেল

1
আমাকে সেলফোরেআউটইন্টেক্সপথ: পদ্ধতিতে এটি রাখতে হয়েছিল। যদি আমি এটিকে ভিউলিআলআউটসুবউজস পদ্ধতিতে রাখি তবে গণনা করা বিষয়বস্তুর আকার উচ্চতা আনুমানিক উচ্চতার উপর নির্ভর করে, প্রকৃত সামগ্রীর উচ্চতার উপর নির্ভর করে না।
মনু ম্যাটিওস

21

আমি এটি আইওএস 7 এ চেষ্টা করেছি এবং এটি আমার পক্ষে কাজ করেছে

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

3
যদি আপনার ইউআইটিএবলভিউ গতিশীল হয় (যার অর্থ ফ্লাইতে এবং এ থেকে তথ্য লোড হয়), আপনাকে ভিউডিডোডে নয়, অন্য কোথাও এটি লাগাতে হবে। আমার জন্য, আমি এটি সেলফোর্ডআউটইন্ডেক্সপ্যাথে রেখেছি। পুরানো "প্রোপার্টি টেবিলভিউ পাওয়া যায় নি" ত্রুটি এড়াতে আমার আইবিউটলেট সম্পত্তি হিসাবে "টেবিলভিউ" পরিবর্তন করতে হয়েছিল।
jeremytripp

থেক্স, পপওভারের ভিতরে টেবিলভিউটির আকার পরিবর্তন করতে সমস্যা হয়েছিল, এটি কাজ করেছিল
ওলেকসান্দার

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) ইউআইটিএবলভিউয়ের একটি সাবক্লাস তৈরি করুন:

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) আপনার টেবিলের আইবুআউটলেটটি আপনার ভিউকন্ট্রোলারে টেনে আনুন

5) আপনার সারণীর উচ্চতার সীমাবদ্ধতার আইবুআউটলেটটি আপনার ভিউকন্ট্রোলারে টেনে আনুন

6) আপনার ভিউকন্ট্রোলারে এই পদ্ধতিটি যুক্ত করুন:

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

আশাকরি এটা সাহায্য করবে


আমার উত্তরটি দেখুন যা আপনার সাবক্লাসের উপর ভিত্তি করে তবে উচ্চতার সীমাবদ্ধতার কোনও সেটিংয়ের দরকার নেই।
fl034

@ fl034 লিঙ্ক সরবরাহ?
গুলজ

@ fl034 আমি মনে করি না যে যখন আপনার উপাদানগুলি স্ক্রোল ভিউতে এম্বেড করা হবে তখন আপনি প্রতিবন্ধকতাগুলি এড়াতে পারবেন) আমার মামলাটি স্ক্রোলভিউ
গুলজ

আমার কাছে আমার টেবিল
ভিউটিও

আইওএস 13 / এক্সকোড 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
override public var intrinsicContentSize: CGSize { //... return someCGSize }
সুইফ্ট

আমার জন্য কাজ না। এখনও টেবিলের নীচে লুকিয়ে রয়েছে
গুলজ 2'18

5

যদি আপনার কন্টেন্টসাইজটি সঠিক না হয় তবে এটি এটি আনুমানিকরোহাইট (স্বয়ংক্রিয়) এর উপর ভিত্তি করে তৈরি করার আগে এটি ব্যবহার করুন

টেবিলভিউ.টিস্টিমেটেড রো হাইট = 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: স্টোরিবোর্ডে টেবিলভিউ উচ্চতার সীমাবদ্ধতা সেট করুন এবং এটিকে ভিউকন্ট্রোলারে টেনে আনুন। আপনি যদি আপনার ঘরের গড় উচ্চতা জানেন এবং আপনার অ্যারেতে কতগুলি উপাদান রয়েছে তা আপনি জানেন তবে আপনি এই জাতীয় কিছু করতে পারেন:

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

* সম্পাদনা করুন:

সব সমাধান করার পর আমি চেষ্টা এবং তাদের প্রতি কিছু ফিক্সিং ছিল, কিন্তু সম্পূর্ণরূপে না, এই উত্তর যে ব্যাখ্যা এবং সংশোধন করা হয়েছে এই সমস্যা সম্পূর্ণরূপে হয়।


এটি খুব সহজ সমাধান, এটি আমার পক্ষে কাজ করেছিল, আপনাকে ধন্যবাদ @ ডর্ড নীলোভিচ
আর মোহন

1

মিমোর উত্তর এবং অনুজ ভিএম এর উত্তর উভয়ই দুর্দান্ত তবে আপনার যদি একটি বৃহত তালিকা থাকে তবে একটি ছোট সমস্যা আছে এটি সম্ভব যে ফ্রেমের উচ্চতাটি আপনার কয়েকটি ঘরকে কাট করবে।

So. আমি উত্তরটি কিছুটা সংশোধন করেছি:

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

আপনি অটোলআউট ব্যবহার করলে এটি করার আরও অনেক ভাল উপায় আছে: উচ্চতা নির্ধারণ করে এমন প্রতিবন্ধকতা পরিবর্তন করুন। কেবল আপনার টেবিলের সামগ্রীর উচ্চতা গণনা করুন, তারপরে সীমাবদ্ধতাটি সন্ধান করুন এবং এটি পরিবর্তন করুন। এখানে একটি উদাহরণ রয়েছে (ধরে নিলেন যে আপনার সারণির উচ্চতা নির্ধারণ করে যে প্রতিবন্ধকতা আসলে "সমান" সম্পর্কের সাথে একটি উচ্চতা বাধা):

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 this এই সীমাবদ্ধতাটিকে আপনার ভিউ নিয়ামকের সম্পত্তি হিসাবে তৈরি করতে ইন্টারফেস বিল্ডার থেকে আপনার .h ফাইলে নিয়ন্ত্রণ-টানুন। তারপরে আপনি বাধা এবং অনুসন্ধানের মাধ্যমে পুনরাবৃত্তি এড়াতে পারবেন। কেবল সরাসরি সেট করা হয়েছেmyTableHeightConstraint.constant = tableView.contentSize.height
রবিপি

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
    }

অটো লেআউট সেট আপ করার সময় আমি এই ফাংশনটি কল করি (এখানে নমুনা স্ন্যাপকিট ব্যবহার করে তবে আপনি ধারণাটি পান):

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

আমি চাই ইউআইটিএবলভিউ কেবলমাত্র কোষগুলির সম্মিলিত উচ্চতার চেয়ে লম্বা হোক; আমি সেলগুলি লুপ করি এবং কোষগুলির মোট উচ্চতা একত্র করি। যেহেতু এই মুহুর্তে সারণি প্রদর্শনের আকারটি সিজিআরেক্ট.জারো, তাই ঘর দ্বারা সংজ্ঞায়িত অটো লেআউট নিয়মের সম্মান করতে সক্ষম হতে আমার সীমা নির্ধারণ করতে হবে। আমি আকারটি একটি স্বেচ্ছাসেবী মানতে সেট করেছিলাম যা যথেষ্ট পরিমাণে বড় হওয়া উচিত। আসল আকারটি পরে অটো লেআউট সিস্টেম দ্বারা গণনা করা হবে।


1

আমি কিছুটা ভিন্ন উপায়ে করেছি, আসলে আমার টেবিলভিউটি স্ক্রোলভিউয়ের অভ্যন্তরে ছিল তাই আমাকে 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

মুসা আলমাট্রির আপত্তি সংস্করণ

(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

স্টোরিবোর্ড বা প্রোগ্রামিয়ালি ব্যবহার করে একটি টেবিলভিউ উচ্চতা সীমাবদ্ধ করতে। (এই শ্রেণিটি স্বয়ংক্রিয়ভাবে একটি উচ্চতার সীমাবদ্ধতা এনে কনটেন্ট ভিউয়ের উচ্চতাটি আপনার টিউটোভিউ উচ্চতায় সেট করে)।

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) আকারের প্রতিবন্ধকতা নির্ধারণ করবে । এই পদ্ধতিটি ধরে নিয়েছে আপনি অটো লেআউট ব্যবহার করছেন using এই কোডটি cellForRowAtটেবিলভিউ পদ্ধতির ভিতরে স্থাপন করা উচিত ।

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

-1

আপনি যদি নিজের টেবিলটি গতিশীল হতে চান তবে উপরে বর্ণিত টেবিলের বিষয়বস্তুর উপর ভিত্তি করে আপনাকে সমাধান ব্যবহার করতে হবে। আপনি যদি কেবল একটি ছোট টেবিল প্রদর্শন করতে চান তবে আপনি একটি ধারক ভিউ ব্যবহার করতে পারেন এবং এতে একটি ইউআইটিএবলভিউ কনট্রোলার এম্বেড করতে পারেন - ইউআইটিএবলভিউ কনটেইনার আকার অনুসারে পুনরায় আকার দেওয়া হবে।

এটি প্রচুর গণনা এড়িয়ে যায় এবং লেআউটে কল করে।


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;        
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.