ইউআইটিএবলভিউ গতিশীল কক্ষের উচ্চতা কিছু স্ক্রোলিংয়ের পরে কেবল সঠিক


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 সালে একটি সমস্যা
Fattie

নিম্নলিখিত লিঙ্কে আমাকে কী সাহায্য করেছে আমি তা খুঁজে পেয়েছি - এটি পরিবর্তনশীল উচ্চতার টেবিল ভিউ সেলগুলির একটি দুর্দান্ত ব্যাপক আলোচনা: স্ট্যাকওভারফ্লো.com
অ্যান্ডি ওয়েইনস্টেইন

উত্তর:


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সেখানে কল করতে পছন্দ করব যেখানে আমি জানি কেন এটি প্রয়োজনীয়।
0:43 এ ব্ল্যাক করুন

2
আমার জন্য কাজ! এবং আমি এটি কেন প্রয়োজন তা জানতে চাই!
মোস্তফা

আপনি যদি আকারের শ্রেণি রেন্ডার করেন তবে তা কার্যকর হয়নি, যা কোনও এক্স-এর চেয়ে আলাদা
আন্দ্রেই কনস্ট্যান্টিনভ 21

@ আন্দ্রেকনস্টান্টিনভ হ্যাঁ এটি আকারের শ্রেণীর সাথে কাজ করে না, আমি কীভাবে এটি আকারের শ্রেণীর সাথে কাজ করব?
z22

এটি সাইজ ক্লাস ছাড়াই কাজ করে, সাইজ ক্লাসের সাথে কোনও সমাধান?
যুবরাজিংহ

38

অন্যান্য অনুরূপ সমাধানগুলি যখন না করায় এটি আমার পক্ষে কাজ করেছিল:

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

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


1
গৃহীত উত্তরের চেয়ে উত্তম কারণ এটি কেবল তখনই বলা হয় যখন সেলটি প্রতিটি ঘর প্রদর্শনের পরিবর্তে এক্সবি থেকে লোড করা হয়। খুব কম কোড লাইন।
রবার্ট ওয়াগস্টাফ

3
কল করতে ভুলবেন নাsuper.didMoveToSuperview()
সিসেরোক্যামারগো

@ সিকারেরোকামারগো অ্যাপল সম্পর্কে বলেছেন didMoveToSuperview: "এই পদ্ধতির ডিফল্ট প্রয়োগটি কিছুই করে না।"
ইভান স্মেটানিন

4
@ ইভানসমেটানিন ডিফল্ট বাস্তবায়ন যদি কিছু না করে তবে কিছু যায় আসে না, আপনার তখনও সুপার পদ্ধতিটি কল করা উচিত কারণ এটি ভবিষ্যতে আসলে কিছু করতে পারে।
টিএনগুইন

(কেবলমাত্র বিটিডব্লিউ আপনার অবশ্যই সুপার বলা উচিত one এটির জন্য I আমি কোনও প্রকল্প কখনও দেখিনি যেখানে টিম সামগ্রিকভাবে একাধিকবার কোষগুলিকে সাবক্লাস করে না, তাই অবশ্যই আপনাকে অবশ্যই এগুলি সমস্ত বাছাই করতে হবে AND পৃথক ইস্যু ঠিক কি TNguyen বলেন)।
Fattie

22

যোগ করার পদ্ধতি [cell layoutIfNeeded]মধ্যে cellForRowAtIndexPathএমন কক্ষগুলিকে প্রাথমিকভাবে আউট-অফ-দৃশ্য স্ক্রল জন্য কাজ করে না।

বা এটি প্রিফেসিং করে না [cell setNeedsLayout]

তাদের সঠিক আকার পরিবর্তন করতে আপনাকে এখনও কয়েকটি নির্দিষ্ট কক্ষ স্ক্রোল করতে হবে এবং ফিরে যেতে হবে view

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


আমার জন্যও একই. আমি যখন প্রথম স্ক্রোল করি তখন কক্ষের আকার 44px হয়। আমি যদি ঘরটি দৃষ্টিশক্তি থেকে দূরে সরিয়ে স্ক্রোল করে ফিরে আসি তবে এটি সঠিকভাবে আকারযুক্ত। আপনি কি কোনও সমাধান খুঁজে পেয়েছেন?
সর্বাধিক

আপনাকে ধন্যবাদ @ ashy_32 বিট এটি আমার জন্যও এটি সমাধান করেছে।
ইমপ্রুয়েস্টক্লাব

এটি একটি সরল বাগ বলে মনে হচ্ছে, @ পরিস্থিতি ঠিক? ভয়াবহ স্টাফ
ফ্যাটি

3
[cell layoutSubviews]লেআউটআইফেনিডের পরিবর্তে ব্যবহার করা সম্ভব হতে পারে। পড়ুন stackoverflow.com/a/33515872/1474113
ypresto

14

আমার একটি প্রকল্পে আমার একই অভিজ্ঞতা ছিল।

কেন এমন হয়?

স্টোরিবোর্ডে কিছু ডিভাইসের জন্য কিছু প্রস্থ সহ সেল ডিজাইন করা হয়েছে। উদাহরণস্বরূপ 400px। উদাহরণস্বরূপ আপনার লেবেলের একই প্রস্থ রয়েছে। এটি স্টোরিবোর্ড থেকে লোড হয়ে গেলে এর প্রস্থ 400px থাকে।

এখানে একটি সমস্যা:

tableView:heightForRowAtIndexPath: সেল লেআউট এটির পূর্বরূপগুলির আগে বলা হয়।

সুতরাং এটি 400px প্রস্থ সহ লেবেল এবং কক্ষের জন্য উচ্চতা গণনা করেছে। তবে আপনি স্ক্রিন সহ ডিভাইসে চালিত হন, উদাহরণস্বরূপ, 320px। এবং এটি স্বয়ংক্রিয়ভাবে গণনা করা উচ্চতাটি ভুল। কেবলমাত্র আপনি নিজের লেবেলের জন্য ম্যানুয়ালি সেট করে থাকলেও layoutSubviewsকেবলমাত্র সেলটির পরে ঘটেtableView:heightForRowAtIndexPath:preferredMaxLayoutWidthlayoutSubviews তাতে কোনও লাভ হয় না।

আমার সমাধান:

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
আমি যখন এই ইস্যুটিতে ছড়িয়ে পড়লাম তখন আমারও টেবিলভিউয়ের ফ্রেমটি সঠিক ছিল তা নিশ্চিত করা দরকার, তাই আমি টেবিলভিউটি জনিত হওয়ার আগে [সেল্ফট্যাটভিউ লেআউটআইফনিড] বলেছিলাম view
GK100

এটি ভুল প্রস্থের সাথে করতে হবে তা ভেবে আমি কখনও থামিনি। cell.frame.size.width = tableview.frame.widthতারপর cell.layoutIfNeeded()মধ্যে cellForRowAtফাংশন আমার জন্য কৌতুক করেনি
ক্যাম কনর

10

আমার একই ধরণের সমস্যা রয়েছে, প্রথম লোডে, সারিটির উচ্চতা গণনা করা হয়নি তবে কিছুটা স্ক্রোলিংয়ের পরে বা অন্য স্ক্রিনে গিয়ে আমি ফিরে এসেছি এই পর্দার সারিগুলি গণনা করা হয়। প্রথম লোডে আমার আইটেমগুলি ইন্টারনেট থেকে লোড হয় এবং দ্বিতীয় লোডে আমার আইটেমগুলি প্রথমে কোর ডেটা থেকে লোড করা হয় এবং ইন্টারনেট থেকে পুনরায় লোড করা হয় এবং আমি লক্ষ্য করেছি যে সারিগুলির উচ্চতা ইন্টারনেট থেকে রিলোডে গণনা করা হয়। সুতরাং আমি লক্ষ্য করেছি যে যখন টেবিল ভিউ.রেলোডডাটা () সেগ অ্যানিমেশন চলাকালীন ডাকা হয় (পুশ এবং উপস্থিত সেগুতে একই সমস্যা) তখন সারি উচ্চতা গণনা করা হত না। সুতরাং আমি দেখুন সূচনাতে টেবিল ভিউটি লুকিয়ে রেখেছি এবং ব্যবহারকারীর উপর কুৎসিত প্রভাব প্রতিরোধ করতে একটি ক্রিয়াকলাপ লোডার রেখেছি এবং আমি 300 মিমি পরে টেবিলভিউ.রেলোডডাটা কল করি এবং এখন সমস্যাটি সমাধান হয়ে গেছে। আমি মনে করি এটি একটি ইউআইকিট বাগ তবে এই কৌশলটি কৌশলটি তৈরি করে।

আমি আমার আইটেম লোড সমাপ্তি হ্যান্ডলারে থিসিস লাইনগুলি (সুইফট 3.0) রেখেছি

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

এটি ব্যাখ্যা করে কেন কিছু লোকের জন্য, লেআউটসুভিউগুলিতে একটি রিলোডলোড ডেটা রেখে সমস্যার সমাধান করে


এটিই একমাত্র WA যা আমার পক্ষেও কাজ করেছিল worked আমি হ্যাশডিন ব্যবহার না করে ডাটাবেস যুক্ত করার সময় টেবিলের আলফা 0 তে সেট করুন, তারপরে পুনরায় লোড করার পরে 1 এ দিন।
পিজে_ফিনেগান

6

উপরের সমাধানগুলির কোনওটিই আমার পক্ষে কাজ করেনি, যাদুবিদ্যার এই রেসিপিটি কী কাজ করেছে: তাদের এই ক্রমে কল করুন:

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

আমার টেবিলভিউ ডেটা একটি ওয়েব পরিষেবা থেকে পপুলেশন করা হয়েছে, সংযোগের কল ব্যাকের উপরে আমি উপরের লাইনগুলি লিখি।


1
5 দ্রুতগতির জন্য এটি সংগ্রহের দৃশ্যেও কাজ করেছে, godশ্বর তোমাকে মঙ্গল করুন, ভাই।
গোবানি ধ্রুব বিজয়কুমার

আমার জন্য, এটি ঘরের সঠিক উচ্চতা এবং লেআউটটি ফিরিয়ে দিয়েছে তবে এতে কোনও ডেটা ছিল না
ড্যারো হার্টম্যান

এই লাইনের পরে setNeedsDisplay () ব্যবহার করে দেখুন
জেহেলিয়া

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) নয়, অন্যথায় স্বয়ংক্রিয় সারির উচ্চতাটি কাজ করবে না।
পিজে_ফিনেগান

5

আমি এই প্রশ্নের বেশিরভাগ উত্তর চেষ্টা করেছি এবং সেগুলির কোনওটিতেই কাজ পেতে পারি নি। আমি খুঁজে পাওয়া একমাত্র কার্যকরী সমাধানটি ছিল আমার UITableViewControllerসাবক্লাসে নিম্নলিখিতগুলি যুক্ত করা :

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

UIView.performWithoutAnimationকল প্রয়োজন বোধ করা হয়, অন্যথায় আপনি দৃশ্য নিয়ামক লোড হওয়ার স্বাভাবিক টেবিল ভিউ অ্যানিমেশন দেখতে হবে।


কাজ করে এবং পুনরায় লোডডাটা দু'বার চাওয়ার চেয়ে স্পষ্টতই ভাল
জিমি জর্জি থমাস

2
কালো যাদু. এটি করা viewWillAppearআমার পক্ষে কাজ করে না, তবে এটি করার চেষ্টা করে viewDidAppear
মার্টিন

ভিউডিডঅ্যাপারে প্রয়োগ করার সময় এই সমাধানটি আমার জন্য 'কাজ' করেছে। সঠিক মাপ দেওয়ার সাথে সাথে টেবিলের বিষয়বস্তু লাফিয়ে উঠলে এটি ব্যবহারকারীর অভিজ্ঞতার জন্য কোনওভাবেই অনুকূল নয়।
রিচার্ডপিয়াজা

আশ্চর্যজনক আমি প্রচুর উদাহরণ চেষ্টা করেছি কিন্তু ব্যর্থ হয় আপনি
শাকিল আহমেদ

@ মার্টিন হিসাবে একই
এজে হার্নান্দেজ


3

cell.layoutIfNeeded()ভিতরে কল cellForRowAtকরা আইওএস 10 এবং আইওএস 11 এ আমার জন্য কাজ করেছে তবে আইওএস 9-তে নয়।

আইওএস 9-এও এই কাজটি পেতে, আমি কল করি cell.layoutSubviews()এবং এটি কৌশলটি করেছিল।


2

আপনার রেফারেন্সের জন্য স্ক্রিনশট সংযুক্ত করাআমার জন্য এই পদ্ধতির কোনওটিই কাজ করে নি, তবে আমি আবিষ্কার করেছি যে লেবেলের Preferred Widthইন্টারফেস বিল্ডারে একটি স্পষ্ট সেট রয়েছে। এটি অপসারণ করা হচ্ছে ("স্পষ্টত" পরীক্ষা করা হয়নি) এবং তারপরে UITableViewAutomaticDimensionপ্রত্যাশার মতো কাজ করা।


2

আমি এই পৃষ্ঠায় সমস্ত সমাধানের চেষ্টা করেছি কিন্তু ব্যবহারের আকারের ক্লাসগুলি পরীক্ষা না করে পরীক্ষা করে আবার পরীক্ষা করে আমার সমস্যার সমাধান করেছি।

সম্পাদনা করুন: মাপের ক্লাসগুলি পরীক্ষা না করা স্টোরিবোর্ডে প্রচুর সমস্যা সৃষ্টি করে তাই আমি আরও একটি সমাধান চেষ্টা করেছি। আমি আমার দৃশ্যের নিয়ামক viewDidLoadএবং viewWillAppearপদ্ধতিতে আমার টেবিলের দৃশ্যটি পপুলেট করেছি । এটি আমার সমস্যার সমাধান করেছে।


1

পুনরায় আকার দেওয়ার লেবেলটি নিয়ে আমার সমস্যা আছে তাই আমি শুধু করণীয় করতে চাই
আকারটি লেবেলটি পাঠ্য টেক্সটলবেল.টেক্সট = চ্যাটমেসেজ.মেসেজ চ্যাট টেক্সটলবেল করতে চাই? টেক্সট সেটআপ করার পরে।

// সম্পূর্ণ কোড

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

আমার ক্ষেত্রে, আমি অন্যান্য চক্র আপডেট করছি। সুতরাং লেবেল পাঠ্যক্রম সেট হওয়ার পরে টেবিলভিউসেলের উচ্চতা আপডেট করা হয়েছিল। আমি অ্যাসিঙ্ক ব্লকটি মুছে ফেলেছি।

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
     // }
}

আমারও একটি অ্যাসিঙ্ক ব্লক আছে তবে এটি কি দরকার? বিকল্প নেই?
নজর মেডিওরোস

1

কেবলমাত্র নিশ্চিত করুন যে আপনি লেবেল পাঠ্যটি 'উইলডিসপ্লেসেল' টেবিল দর্শনের প্রতিনিধি পদ্ধতিতে সেট করছেন না। গতিশীল উচ্চতার গণনার জন্য 'সেলফোরআউটিটেক্সপথ' প্রতিনিধি পদ্ধতিতে লেবেল পাঠ্যটি সেট করুন।

আপনাকে স্বাগতম :)


1

আমার ক্ষেত্রে, ঘরের একটি স্ট্যাক ভিউ সমস্যা সৃষ্টি করছিল। স্পষ্টতই এটি একটি বাগ। একবার আমি এটি সরিয়ে ফেললে সমস্যাটি সমাধান হয়ে গেল।


1
আমি অন্য সমস্ত সমাধানের চেষ্টা করেছি, ওনি আপনার সমাধানটি ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ দেওয়ার জন্য কাজ করেছে
tamtoum1987

1

সমস্যাটি হ'ল আমাদের বৈধ সারির উচ্চতা হওয়ার আগে প্রাথমিক কক্ষগুলি লোড হয়। কর্মক্ষেত্রটি হ'ল দৃশ্যের উপস্থিতিটি যখন একটি টেবিল পুনরায় লোড করতে বাধ্য হয়।

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

এটি ছিল আমার থেকে অনেক দূরে সর্বাধিক উন্নত সমাধান। এটি সেলের 100% সংশোধন করে নি তবে ৮০% পর্যন্ত তাদের আসল আকার নিচ্ছে। অনেক ধন্যবাদ
থ্র্যাব্লোপার

1

শুধুমাত্র iOS 12+ এর জন্য, 2019 এর পরে ...

অ্যাপলের মাঝেমধ্যে উদ্ভট অক্ষমতার একটি চলমান উদাহরণ, যেখানে আক্ষরিক বছর ধরে সমস্যাগুলি চলে।

এটি কেস হিসাবে মনে হয় না

        cell.layoutIfNeeded()
        return cell

এটি ঠিক করবে। (আপনি অবশ্যই কিছু পারফরম্যান্স হারাচ্ছেন।)

অ্যাপলের সাথে এমনই জীবন।


0

আমার ক্ষেত্রে, কক্ষের উচ্চতা নিয়ে সমস্যাটি প্রাথমিক টেবিল ভিউ লোড হওয়ার পরে ঘটে এবং একটি ব্যবহারকারী পদক্ষেপ নেয় (একটি ঘরের বোতামে ট্যাপিং রয়েছে যা ঘরের উচ্চতা পরিবর্তনের প্রভাব ফেলে)। আমি না করলে সেলটির উচ্চতা পরিবর্তন করতে আমি অক্ষম ছিলাম:

[self.tableView reloadData];

আমি চেষ্টা করেছিলাম

[cell layoutIfNeeded];

কিন্তু এটি কার্যকর হয়নি।


0

সুইফ্ট ৩. প্রতিবার পুনরায় ব্যবহারযোগ্য ঘরের পাঠ্য আপডেট করার সময় আমাকে সেল.এলআউটআইফনেড () কল করতে হয়েছিল।

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

উপরের সমাধানগুলির মধ্যে কোনটিই প্রস্তাবনাগুলির নিম্নলিখিত সংমিশ্রণ ব্যতীত কাজ করে না।

ভিডডিডলড () এ নিম্নলিখিতগুলি যুক্ত করতে হয়েছিল।

DispatchQueue.main.async {

        self.tableView.reloadData()

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

        self.tableView.reloadData()

    }

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

ডিভিডলডে নিম্নলিখিতগুলিও সেট করুন

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = MyEstimatedHeight

টেবিলভিউতে (_ টেবিল ভিউ: ইউআইটিএবলভিউ, সেলফরওআউট ইন্ডেক্সপথ: ইনডেক্সপথ)

cell.setNeedsLayout()
cell.layoutIfNeeded() 

আমার অনুরূপ reloadData/beginUpdates/endUpdates/reloadDataকাজ করছে; দ্বিতীয় বার বলা reloadData উচিত । এটি মোড়ানো প্রয়োজন হবে না async
রে

0

আমি এই সমস্যাটিতে দৌড়েছি এবং আমার ভিউ / লেবেল আরম্ভকরণ কোডটি FROM tableView(willDisplay cell:)TO এ সরিয়ে এটি ঠিক করেছি tableView(cellForRowAt:)


যা না একটি সেল আরম্ভ করার প্রস্তাবিত উপায়। willDisplayতুলনায় ভাল পারফরম্যান্স হবে cellForRowAt। কেবলমাত্র সঠিক কক্ষটি ইনস্ট্যান্সেট করতে সর্বশেষতমটি ব্যবহার করুন।
মার্টিন

2 বছর পরে, আমি লিখেছিলাম যে পুরানো মন্তব্য পড়ছি। এটি একটি খারাপ পরামর্শ ছিল। এমনকি যদি willDisplayআরও ভাল পারফরম্যান্স থাকে cellForRowAtতবে লেআউটটি স্বয়ংক্রিয় হলে আপনার সেল UI শুরু করার পরামর্শ দেওয়া হয় । প্রকৃতপক্ষে, লেআউটটি সেলফোরআউটের পরে ইউআইকিট দ্বারা গণনা করা হবে এবং উইলডিজপ্লের আগে । সুতরাং যদি আপনার ঘরের উচ্চতা তার সামগ্রীর উপর নির্ভর করে তবে লেবেল সামগ্রী (বা যাই হোক না কেন) এর সূচনা করুন 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;


}

এই কোডটি আপনাকে লেবেলে প্রদর্শিত পাঠ্যের জন্য গতিশীল উচ্চতা সন্ধান করতে সহায়তা করে।


প্রকৃতপক্ষে রমেশ, যতক্ষণ না টেবিল ভিউ.টিস্টিমেটেড রো হাইট এবং টেবিলভিউ.রোহাইট = ইউআইটিএবলভিউআউটমেটিক ডাইমেনশন বৈশিষ্ট্য সেট করা থাকে ততক্ষণ এর প্রয়োজন হবে না। এছাড়াও, কাস্টম সেলের বিভিন্ন উইজেট এবং কনটেন্টভিউতে উপযুক্ত বাধা রয়েছে তা নিশ্চিত করুন।
BonanzaDriver
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.