NSLayoutConstraint "ইউআইভিউ-এনক্যাপসুলেটেড-লেআউট-উচ্চতা" কী এবং আমি কীভাবে এটিকে পরিষ্কারভাবে পুনরায় গণনা করতে বাধ্য করব?


262

আমার UITableViewআইওএস 8 এর অধীনে চলছে এবং আমি স্টোরিবোর্ডের সীমাবদ্ধতা থেকে স্বয়ংক্রিয় সেল হাইট ব্যবহার করছি।

আমার কোষগুলির মধ্যে একটিতে একটি রয়েছে UITextViewএবং ব্যবহারকারীর ইনপুটের উপর ভিত্তি করে চুক্তি করতে এবং প্রসারিত করতে আমার এটি প্রয়োজন - পাঠ্য সঙ্কুচিত / প্রসারিত করতে আলতো চাপুন।

আমি পাঠ্য দর্শনে একটি রানটাইম সীমাবদ্ধতা যুক্ত করে এবং ব্যবহারকারীর ইভেন্টগুলির প্রতিক্রিয়া হিসাবে সীমাবদ্ধতার উপর ধ্রুবকটি পরিবর্তন করে এটি করছি:

-(void)collapse:(BOOL)collapse; {

    _collapsed = collapse;

    if(collapse)
        [_collapsedtextHeightConstraint setConstant: kCollapsedHeight]; // 70.0
    else
        [_collapsedtextHeightConstraint setConstant: [self idealCellHeightToShowFullText]];

    [self setNeedsUpdateConstraints];

}

যখনই আমি এটি করি, আমি এটি tableViewআপডেটগুলিতে গুটিয়ে রাখি এবং কল করি [tableView setNeedsUpdateConstraints]:

[tableView beginUpdates];

[_briefCell collapse:!_showFullBriefText];

[tableView setNeedsUpdateConstraints];
// I have also tried 
// [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
// with exactly the same results.

[tableView endUpdates];

আমি যখন এটি করি তখন আমার ঘরটি প্রসারিত হয় (এবং এটি করার সময় অ্যানিমেট করে) তবে আমি একটি সীমাবদ্ধতা সতর্কতা পাই:

2014-07-31 13:29:51.792 OneFlatEarth[5505:730175] Unable to simultaneously satisfy constraints.

Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 

(

    "<NSLayoutConstraint:0x7f94dced2b60 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'(388)]>",

    "<NSLayoutConstraint:0x7f94dced2260 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...']-(15)-|   (Names: '|':UITableViewCellContentView:0x7f94de5773a0 )>",

    "<NSLayoutConstraint:0x7f94dced2350 V:|-(6)-[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...']   (Names: '|':UITableViewCellContentView:0x7f94de5773a0 )>",

    "<NSLayoutConstraint:0x7f94dced6480 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f94de5773a0(91)]>"
 )

Will attempt to recover by breaking constraint 

<NSLayoutConstraint:0x7f94dced2b60 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'(388)]>

388 আমার গণনা করা উচ্চতা, অন্য সীমাবদ্ধতাগুলি UITextViewXcode / IB থেকে আমার।

চূড়ান্তটি আমাকে বিরক্ত করছে - আমি অনুমান করছি যে UIView-Encapsulated-Layout-Heightসেলটি যখন প্রথম রেন্ডার করা হয় তখন এটি গণনা করা উচ্চতা - (আমি আমার UITextViewউচ্চতাটি> = 70.0 হিসাবে সেট করেছিলাম ) তবে এটি সঠিক বলে মনে হয় না যে এই উদ্ভূত প্রতিবন্ধকতাটি তখন একটিটিকে ছাড়িয়েছে ব্যবহারকারী আপডেট করা হয়েছে।

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

সুতরাং, কী NSLayoutConstraint UIView-Encapsulated-Layout-Height(আমি অনুমান করছি এটি স্বয়ংক্রিয় সেল আকার দেওয়ার জন্য গণনা করা উচ্চতা) এবং কীভাবে আমি এটিকে পরিষ্কারভাবে পুনরায় গণনা করতে বাধ্য করব?


3
ক্রস অ্যাপল দেব ফোরামগুলিতে পোস্ট করেছে: devforums.apple.com/thread/238803
রোগ

3
আমি নিম্নলিখিত পদ্ধতিতে অনুরূপ সমস্যার সমাধান করেছি এবং এটি আইওএস 7/8 এ কাজ করে। 1) বাধ্যতা অগ্রাধিকার 750 আমি 1 ম বা 2nd 2) awakeFromNib সেটে সেল উপশ্রেণী মধ্যে চেষ্টা করবে নিম্নতর এক self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;। আমি মনে করি প্রাথমিকভাবে স্বয়ংক্রিয় আকারের মুখোশটি সেট করা শেষ সীমাবদ্ধতাটি যুক্ত হওয়া থেকে থামায়। আমি এই সমাধানটি এখানে পেয়েছি: github.com/wordpress-mobile/WordPress-iOS/commit/…
জেসি

3
@ রোজারনোলান, কোন খবর? ইন্টারফেস বিল্ডারে অটো-লেআউট নিয়ে খেলতে গিয়ে আমি একই সমস্যা পেয়েছি। কিছু সেল এই সমস্যার কারণ হয়, কিছু না।
orkenstein

3
আমি মনে করি না যে একটি অটোরেসাইজিং চিহ্ন যুক্ত করা ভাল সমাধান।
রোগ

1
@ রাজারনোলান আপনি কি এই লেআউট পরিবর্তনগুলি সম্পাদন করার আগে আইবিতে এই ঘরটি তৈরি করছেন? আমি একই সমস্যাটি ডিবাগ করছি তবে আমি কোনও অতিরিক্ত বাধা যুক্ত করছিলাম না। আমি স্ক্র্যাচ থেকে আমার দৃষ্টিভঙ্গিটি পুনর্নির্মাণ করে সতর্কতা দমন করতে সক্ষম হয়েছি এবং আমি যখন 2 স্টোরিবোর্ড ফাইলগুলি পৃথক করেছি তখন কেবলমাত্র তফাতটি ছিল যে সতর্কতা সহ সংস্করণটি <rect key="frame" x="0.0" y="0.0" width="600" height="110"/>তার সংজ্ঞায় লাইনটি অনুপস্থিত ছিল , আমাকে বিশ্বাস করতে বাধ্য করেছে এটি একটি আইবি বাগ । কমপক্ষে আমার যাইহোক ছিল।
ইল নীল

উত্তর:


301

আপনার অগ্রাধিকারটি _collapsedtextHeightConstraint999 এ কম করার চেষ্টা করুন That এইভাবে সিস্টেম সরবরাহ করা UIView-Encapsulated-Layout-Heightসীমাবদ্ধতা সর্বদা প্রাধান্য নেয়।

এটি আপনি কী ফিরে আসবেন তার উপর ভিত্তি করে -tableView:heightForRowAtIndexPath:। সঠিক মান এবং আপনার নিজের সীমাবদ্ধতা এবং উত্পন্ন একটি একই হওয়া উচিত তা নিশ্চিত করুন। আপনার নিজের সীমাবদ্ধতার জন্য নিম্ন অগ্রাধিকার কেবল অস্থায়ীভাবে সংঘাতগুলি রোধ করার জন্য প্রয়োজন যখন পতন / প্রসারিত অ্যানিমেশনগুলি ফ্লাইটে রয়েছে।


74
এটি আমি যা চাই তার ঠিক বিপরীত অর্জন করবে। ইউআইভিউ-এনক্যাপসুলেটেড-লেআউট-উচ্চতাটি ভুল - এটি পূর্ববর্তী লেআউটের অন্তর্ভুক্ত।
রোগ

7
UIView-Encapsulated-Layout-Heightউচ্চতা নির্ধারণের পরে প্রতিবন্ধকতাটি ইউআইটিএবলভিউ যুক্ত করে। আমি systemLayoutSizeFittingSizeকনটেন্টভিউয়ের ভিত্তিতে উচ্চতা গণনা করি। এখানে, কিছু যায় UIView-Encapsulated-Layout-Heightআসে না। তারপরে, টেবিলভিউ কন্টেন্টসাইজকে সুস্পষ্টভাবে ফিরে আসা মানটিতে সেট করে heightForRowAtIndexPath:। এক্ষেত্রে আমাদের কাস্টম সীমাবদ্ধতার অগ্রাধিকার হ্রাস করা সঠিক কারণ টেবিলভিউ সীমাটি সারি হাইটগুলি গণনার পরে অবশ্যই অগ্রাধিকার নিতে হবে।
অর্টউইন জেন্টজ

8
@ অর্টউইনজেন্টজ: তবুও আমাদের কাস্টম সীমাবদ্ধতার অগ্রাধিকারটি কমিয়ে আনার বিষয়টি সঠিকভাবে পয়েন্টটি পাবেন না কারণ সারি হাইটগুলি গণনার পরে টেবিলভিউ সীমাবদ্ধতাটি অবশ্যই অগ্রাধিকার নিতে হবে । জিনিস যে UIView-Encapsulated-Layout-Heightভুল আমি যদি অগ্রাধিকার নীচু না ...
পরীক্ষার

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

9
-১ এই উত্তরের জন্য এটি যেহেতু যুক্ত হওয়া সীমাবদ্ধতাটি সঠিক বলে ধরেছে। যোগ UIView-Encapsulated-Layout-Widthআমার ক্ষেত্রে মাত্র ভুল, কিন্তু এটা রানটাইম আমার স্পষ্ট সীমাবদ্ধতার বেশী প্রাধান্য বলে মনে হয়।
রশ্মি

68

আমার একইরকম দৃশ্য রয়েছে: এক সারি ঘর সহ একটি টেবিল ভিউ, যেখানে ইউআইএলবেল অবজেক্টের কয়েকটি লাইন রয়েছে। আমি আইওএস 8 এবং অটোলেআউট ব্যবহার করছি।

যখন আমি ঘোরালাম তখন আমি ভুল সিস্টেম গণনা করা সারি উচ্চতা পেয়েছিলাম (43.5 প্রকৃত উচ্চতার চেয়ে অনেক কম)। এটা দেখতে অনেকটা:

"<NSLayoutConstraint:0x7bc2b2c0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7bc37f30(43.5)]>"

এটি কেবল একটি সতর্কতা নয়। আমার টেবিল ভিউ ঘরের লেআউটটি ভয়ানক - সমস্ত পাঠ্য একটি পাঠ্য লাইনে ওভারল্যাপ করা।

এটি আমাকে অবাক করে দেয় যে নীচের লাইনটি আমার সমস্যাটিকে যাদুকরীভাবে "ঠিক করে" দেয় (অটোলেআউট কোনও কিছুই অভিযোগ করে না এবং আমি স্ক্রিনে যা প্রত্যাশা করি তা পাই):

myTableView.estimatedRowHeight = 2.0; // any number but 2.0 is the smallest one that works

এই লাইনটি সহ বা ছাড়াই:

myTableView.rowHeight = UITableViewAutomaticDimension; // by itself this line only doesn't help fix my specific problem

8
অবশেষে! এটি একটি সঠিক উত্তর। ডাব্লুডাব্লুডিসি অধিবেশনে এটি উল্লেখ করা হয়েছিল, আপনি যদি স্বয়ংক্রিয় সারি উচ্চতার আকার ব্যবহার করতে চান তবে আপনি একটি আনুমানিক রও হাইট সেট করুন বা খারাপ কিছু ঘটে। (হ্যাঁ, অ্যাপল সত্যিই বাজে বিষয়গুলি ঘটেছে)
আবদালরহমান শাতো

50
এফডব্লিউআইডাব্লু, অনুমানটি যুক্ত করা আমার পক্ষে মোটেই কোনও পার্থক্য করে না।
বেনজহান

3
হেহ। আমি আবার এই একই উত্তর ফিরে এসেছি, এবং আনন্দ এবং আশা সঙ্গে এটি বাস্তবায়ন করতে গিয়েছিলাম। আবার, এটি আমার জন্য কোনও
ত্রুটিযুক্ত হয়নি

3
টেবিল ভিউ দ্বারা ফিরে আসা অনুমান: আনুমানিক হাইটফোরআরএটিআইডেক্সপথ: অবশ্যই কমপক্ষে সেল হিসাবে বড় হওয়া উচিত। অন্যথায়, টেবিলের গণনা করা উচ্চতা প্রকৃত উচ্চতার চেয়ে কম হবে এবং টেবিলটি উপরে স্ক্রোল করতে পারে (উদাহরণস্বরূপ টেবিলে অনিচ্ছাকৃত সেগুটি ফেরার পরে)। ইউআইটিএবলভিউআউটমেটিক মাত্রা ব্যবহার করা উচিত নয়।
ম্যাট

1
মনে রাখবেন যে যত কম নীচের দিকে estimatedRowHeightপ্রায়শই cellForRowAtIndexPathবলা হবে called সুনির্দিষ্ট হওয়ার জন্য টেবিলভিউ উচ্চতা আনুমানিক রো হাইট টাইম দ্বারা বিভক্ত। একটি 12 ইঞ্চি আইপ্যাড প্রোতে, এটি সম্ভবত কয়েক হাজারের মধ্যে একটি সংখ্যা হতে পারে এবং এটি ডেটাসোর্সকে হাতুড়ি করে দেবে এবং ফলস্বরূপ একটি বিলম্ব হতে পারে।
মোজো 66

32

সীমাবদ্ধতার সতর্কতার বার্তাগুলি বলছে যে এটি ভঙ্গ করতে হয়েছিল (নীচে ) সীমাবদ্ধতার একটি মানকে অগ্রাধিকার উল্লেখ করে আমি চলে যাওয়ার সতর্কতাটি পেতে সক্ষম হয়েছি "Will attempt to recover by breaking constraint"। দেখা যাচ্ছে যে যতক্ষণ আমি এর চেয়ে বড় কিছুকে অগ্রাধিকার সেট করব ততক্ষণ 49সতর্কবাণীটি চলে যাবে।

আমার জন্য এর অর্থ হ'ল আমার প্রতিবন্ধকতা পরিবর্তন করা সতর্কবার্তাটি বলেছিল এটি ভঙ্গ করার চেষ্টা করেছে:

@"V:|[contentLabel]-[quoteeLabel]|"

প্রতি:

@"V:|-0@500-[contentLabel]-[quoteeLabel]|"

আসলে, আমি এই সীমাবদ্ধতার যে কোনও উপাদানকে অগ্রাধিকার যোগ করতে পারি এবং এটি কার্যকর হবে। এটি কোনটি মনে হয় না। আমার কোষগুলি যথাযথ উচ্চতা শেষ করে এবং সতর্কতা প্রদর্শিত হয় না। রজার, উদাহরণস্বরূপ, উচ্চতার মান সীমাবদ্ধতার (যেমন, ) @500ঠিক পরে যুক্ত করার চেষ্টা করুন ।388388@500

কেন এটি কাজ করে তা আমি পুরোপুরি নিশ্চিত নই তবে আমি কিছুটা তদন্ত করেছি। ইন NSLayoutPriority enum , দেখে মনে হচ্ছে NSLayoutPriorityFittingSizeCompressionঅগ্রাধিকার স্তর 50। সেই অগ্রাধিকার স্তরের নথি বলছে:

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

ডকুমেন্টেশন রেফারেন্সড জন্য fittingSizeবার্তা লেখা আছে:

দৃশ্যের সর্বনিম্ন আকার যা এটি ধারণ করে তা সীমাবদ্ধ করে satisf (শুধুমাত্র পাঠযোগ্য)

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

আমি এর বাইরে খনন করি নি তবে মনে হয় যে সমস্যাটি যেখানে রয়েছে তার সাথে এর কিছু করার আছে।


থ্যাঙ্কস জেফ। তবুও আমার কাছে বাগের মতো মনে হচ্ছে। অ্যাপল যদিও রডারটির প্রতিক্রিয়া জানায়নি :-(
রোগ

12

আমি একটি কৃত্রিম সরিয়ে এটির ত্রুটি সমাধান করতে সক্ষম হন cell.layoutIfNeeded()যে আমি আমার মধ্যে ছিল tableView'র cellForRowAtপদ্ধতি।


1
হ্যাঁ, এটি আমার জন্যও সমস্যাটি সমাধান করেছে। আমি কোড লেআউট কনট্রেন্টগুলি করছিলাম তাই আমি প্রাথমিকভাবে ভেবেছিলাম যে আমি কিছু মিস করতে পারি। ধন্যবাদ
জন

1
একই জিনিস! ধন্যবাদ!
অ্যান্ড্রে চেরুনুখ

12

99.9% সময়, কাস্টম সেল বা শিরোলেখ ব্যবহার করার সময়, যখন UITableViewsপ্রথমবারের টেবিলটি লোড হয় তখন সমস্ত বিবাদ দেখা দেয়। একবার লোড হয়ে গেলে আপনি সাধারণত আর দ্বন্দ্ব দেখতে পাবেন না।

এটি ঘটে কারণ বেশিরভাগ বিকাশকারীরা ঘর / শিরোনামে কোনও উপাদান বিন্যাস করতে সাধারণত একটি নির্দিষ্ট উচ্চতা বা কোনও ধরণের অ্যাঙ্কর সীমাবদ্ধতা ব্যবহার করেন। বিরোধ দেখা দেয় কারণ যখন UITableViewপ্রথম বোঝা / আউট স্থাপন করা হয় তখন এটি তার কোষগুলির উচ্চতা 0 এ সেট করে This এটি স্পষ্টতই আপনার নিজের সীমাবদ্ধতার সাথে দ্বন্দ্ব। এটি সমাধানের জন্য, কেবলমাত্র কোনও স্থির উচ্চতার সীমাবদ্ধতাগুলি কম অগ্রাধিকার ( .defaultHigh) তে সেট করুন। কনসোল বার্তাটি সাবধানতার সাথে পড়ুন এবং দেখুন যে লেআউট সিস্টেমটি বিরতি দেওয়ার সিদ্ধান্ত নিয়েছে const সাধারণত এটিই তার অগ্রাধিকার পরিবর্তনের প্রয়োজন। আপনি এর মতো অগ্রাধিকার পরিবর্তন করতে পারেন:

let companyNameTopConstraint = companyNameLabel.topAnchor.constraint(equalTo: companyImageView.bottomAnchor, constant: 15)
    companyNameTopConstraint.priority = .defaultHigh

NSLayoutConstraint.activate([
            companyNameTopConstraint,
           the rest of your constraints here
            ])

1
সুন্দর ব্যাখ্যা।
গ্লেন

7

সীমাবদ্ধতাগুলি আপডেট করতে টেবিল ভিউটি অবহিত করার পরিবর্তে, ঘরটি পুনরায় লোড করার চেষ্টা করুন:

[tableView beginUpdates];

[_briefCell collapse:!_showFullBriefText];

[tableView reloadRowsAtIndexPaths:@[[tableView indexPathForCell:_briefCell]] withRowAnimation:UITableViewRowAnimationNone];

[tableView endUpdates];

UIView-Encapsulated-Layout-Height প্রাথমিক লোড চলাকালীন ঘরের সীমাবদ্ধতার উপর ভিত্তি করে প্রাথমিক লোডের সময় কক্ষের জন্য গণনা করা টেবিল দৃশ্যটি সম্ভবত উচ্চতা।


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

6
কমপক্ষে একটি উত্তর জমা দেওয়ার জন্য যে কোনও উপায়ে রাখুন। SO এর মতো মনে হচ্ছে এটি অন্যথায় বাষ্পীভূত হতে দেবে।
রোগ

6

আরেকটি সম্ভাবনা:

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

- (CGFloat)calculateHeightForConfiguredSizingCell:(UITableViewCell *)sizingCell {
   [sizingCell setNeedsLayout];
   [sizingCell layoutIfNeeded];
   CGSize size = [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
   return size.height; // should + 1 here if my uitableviewseparatorstyle is not none

}

এটি আমাকে এমন কিছু ক্ষেত্রে সহায়তা করেছিল যেখানে আমি বেশ কয়েকটি সিমুলেটর (আইপ্যাড Plus প্লাস) এর মধ্যে একটি বেশ জটিল সেল বিন্যাসে লেআউটের উচ্চতার অস্পষ্টতা পেয়েছি। আমার কাছে মনে হয় যে কিছু অভ্যন্তরীণ বৃত্তাকার ত্রুটির কারণে সামগ্রীটি কিছুটা চেপে গেছে এবং যদি আমি অস্পষ্টতার চেয়ে বাধাগ্রস্থতাগুলি হ্রাস করতে প্রস্তুত না হই। তাই ফিরে পরিবর্তে UITableViewAutomaticDimensionমধ্যে heightForRowAtIndexPathআমি ফিরে [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize] + 0.1
লিও

আমি অবশ্যই বলতে চাইছি[sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height + 0.1
লিও

অবিশ্বাস্যরূপে; বিভাজক অপসারণ যা আমার টেবিলটি আচরণ করেছে, তাই ধন্যবাদ।
রোয়্যালমুরদার

5

প্রশ্নের মন্তব্যে জেসি উল্লেখ করেছেন , এটি আমার পক্ষে কাজ করে:

self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;

এফওয়াইআই, এই সমস্যাটি আইওএস 10 এ ঘটে না।


2
সুইফটে 4.2 এ: স্ব-কনটেন্টভিউ.আউটোরাইজিংম্যাস্ক = [.ফ্লেক্সিব্লাইটহাইট]
15'4 এয়ারওয়ে

4

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

অবশেষে আমি বুঝতে পেরেছিলাম যে এটি সীমাবদ্ধ স্থির মানটি নিকটতম পূর্ণসংখ্যার সাথে গোল না করায়।

let neededHeight = width / ratio // This is a CGFloat like 133.2353
constraintPictureHeight.constant = neededHeight // Causes constraint error
constraintPictureHeight.constant = ceil(neededHeight) // All good!

2
এটিই আমার মন্তব্য সম্পর্কে মন্তব্য করেছিল। আমার একটি চিত্র ঘর রয়েছে যা গতিশীলভাবে লোড হয় (বেড়ে ওঠা সঙ্কুচিত হয়) এবং আনুমানিকরোহাইট = 50 এবং সারিহাইট = ইউআইটিএবলভিউআউটমেটিক মাত্রা সহ একটি টেবিলভিউ। টেবিলভিউটি সঠিক উচ্চতা সত্ত্বেও আমি এখনও বাধাগুলি ভেঙেছিলাম। বিভাজকগুলির উচ্চতা 0.3.33 ছিল এবং ঘরের জন্য আমার চিত্রের আকারের প্রতিবন্ধকতাটি লাথি মারছিল that বিভাজক বন্ধ করার পরে সমস্ত ভাল ছিল। আমাকে কী দেখার দরকার তা দেওয়ার জন্য ধন্যবাদ চে।

1
এক্ষেত্রে একটি অতিরিক্ত বাধা তৈরি করুন, উদাহরণস্বরূপ, নীচেরমর্গিন> = ভিউ.বটমমার্গিন+1@900। অটোলাউট অতিরিক্ত 1 পয়েন্টের সাথে সামঞ্জস্য করার চেষ্টা করে, ঘরটির আকার পরিবর্তন করে, বিভাজকের উচ্চতার কারণে বিভ্রান্ত হয়, কিছু বাধা ভাঙা / শিথিল করার চেষ্টা করে, একটিটি 900 খুঁজে পেয়েছে এবং এটি বাতিল করে দেয়। সতর্কতা ছাড়াই আপনি চান লেআউটটি পাবেন।
আন্তন

আমার দিন বাঁচাও। যাই হোক না কেন কয়েক ঘন্টা
আন্তন ট্রপ্যাশকো

1

পাঠ্য দর্শনটিকে এর সামগ্রীতে ফিট করার জন্য আকার নির্ধারণ করা এবং উচ্চতা সীমাবদ্ধতা স্থির করে ফলস্বরূপ উচ্চতায় আপডেট করা, UIView-Encapsulated-Layout-Heightআমার জন্য সীমাবদ্ধতার বিরোধকে ঠিক করেছে, যেমন:

[self.textView sizeToFit];
self.textViewHeightConstraint.constant = self.textView.frame.size.height;

আপনি কোথায় এটা করেছেন? লেআউটসুবিউজে?
আট ই

1

এই ত্রুটিটি সহ আমার মাথা আঁচড়ানোর জন্য কয়েক ঘন্টা ব্যয় করার পরে অবশেষে আমি একটি সমাধান খুঁজে পেয়েছি যা আমার পক্ষে কাজ করে। আমার মূল সমস্যাটি হ'ল যে আমার কাছে বিভিন্ন কোষের জন্য একাধিক নিবস নিবন্ধিত ছিল তবে একটি কোষের ধরণটিকে আলাদা আলাদা আকারের অনুমতি দেওয়া হয়েছিল (সেই ঘরের সমস্ত উদাহরণ একই আকার হতে পারে না)। সুতরাং সমস্যাটি উত্থাপিত হয়েছিল যখন টেবিলভিউটি সেই ধরণের একটি ঘর চিহ্নিত করার চেষ্টা করছিল এবং এর আলাদা উচ্চতা হওয়ার ঘটনা ঘটল। সেট করে সমাধান করেছি

self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight; self.frame = CGRectMake(0, 0, self.frame.size.width, {correct height});

যখনই সেলটির আকারটি গণনা করতে তার ডেটা ছিল। আমি বুঝতে পারি যে এটি হতে পারে

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

কিছুটা এইরকম

cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight; cell.frame = CGRectMake(0, 0, self.frame.size.width, {correct height});

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


0

টেবিলভিউ প্রতিনিধি থেকে সূচকপথে সেলের জন্য উচ্চতা পান get তারপরে সেল পান cellForRowAtIndexPath:

top (10@1000)
    cell
bottom (0@1000)

সেল সেল-কনটেন্টভিউ.হাইট: 0 // <-> (ইউআইভিউ-এনক্যাপসুলেটেড-লেআউট-উচ্চতা: 0 @ 1000) শীর্ষ (10 @ 1000) (ইউআইভিউ-এনক্যাপসুলেটেড-লেআউট-উচ্চতা: 0 @ 1000) এর সাথে দ্বন্দ্ব রয়েছে,

কারণ তাদের অগ্রাধিকারগুলি 1000 সমান We আমাদের অগ্রাধিকারের অধীনে আমাদের শীর্ষস্থানীয় অগ্রাধিকার প্রয়োজন UIView-Encapsulated-Layout-Height


0

আমি এই মত একটি বার্তা পেয়েছিলাম:

একসাথে প্রতিবন্ধকতাগুলি পূরণ করতে অক্ষম ...
...
...
...
এনএসলয়েটকন্ট্রেন্ট: 0x7fe74bdf7e50 'ইউআইভিউ-এনক্যাপসুলেটেড-লেআউট-উচ্চতা' ভি: [ইউআইটিবেলভিউসেলকন্টেন্টভিউ: 0x7fe75330c5c0 (21.5)]
...
... এর
মাধ্যমে পুনরুদ্ধারের চেষ্টা করা হবে ব্রেকিং সীমাবদ্ধতা NSLayoutConstraint: 0x7fe0f9b200c0 UITableViewCellContentView: 0x7fe0f9b1e090.bottomMargin == ইউআইএলবেল: 0x7fe0f9b1e970.bottom

উচ্চতার UITableViewCellসাথে আমি একটি কাস্টম ব্যবহার করছি UITableViewAutomaticDimension। এবং আমি estimatedHeightForRowAtIndex:পদ্ধতিটি বাস্তবায়ন করেছি ।

যে সীমাবদ্ধতা আমাকে সমস্যা দিচ্ছিল তা দেখতে কিছুটা এমন দেখাচ্ছিল

[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[title]-|" options:0 metrics:nil views:views];

এই প্রতিবন্ধকতা পরিবর্তন করা সমস্যার সমাধান করবে, তবে অন্য একটি উত্তরের মতো আমি অনুভব করেছি যে এটি সঠিক ছিল না, কারণ এটি আমার সীমাবদ্ধতার যে অগ্রাধিকার প্রয়োজন তা হ্রাস করে:

[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-6@999-[title]-6@999-|" options:0 metrics:nil views:views];

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

[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-6-[title]-6-|" options:0 metrics:nil views:views];

এটির মধ্যে কিছুটা রহস্য |-6-[title]-6-|এবং এর মধ্যে পার্থক্য কী |-[title-|। তবে আকার নির্ধারণ করা আমার পক্ষে কোনও সমস্যা নয় এবং এটি লগগুলি থেকে মুক্তি পেয়েছে এবং আমার প্রয়োজনীয় সীমাবদ্ধতার অগ্রাধিকার কম করার দরকার নেই।


0

কালেকশন ভিউ সেলটিতে আমার একই সমস্যা ছিল।

আমি চূড়ান্ত সীমাবদ্ধতার যে অগ্রাধিকারটি ঘরের নীচে (চেইনের সর্বশেষটি নীচে থেকে নীচের অংশের সাথে যুক্ত ছিল - এটিই শেষ পর্যন্ত এর উচ্চতা নির্ধারণ করে) এর সাথে অগ্রাধিকার কমিয়ে এটি সমাধান করেছি।

ঘরের উচ্চতা সঠিক ছিল, এবং সতর্কতাগুলি চলে গেল।


-1

সেট করুন এটি এই view.translatesAutoresizingMaskIntoConstraints = NO;সমস্যার সমাধান করা উচিত।


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