ইউআইএসট্যাকভিউ "স্কোয়াড" লুকানো দর্শনগুলিতে "একই সাথে সীমাবদ্ধতাগুলি পূরণ করতে অক্ষম"


97

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

একসাথে সীমাবদ্ধতাগুলি পূরণ করতে অক্ষম। সম্ভবত নিম্নলিখিত তালিকার অন্তত একটি বাধা হ'ল যা আপনি চান না। এটি ব্যবহার করে দেখুন: (1) প্রতিটি সীমাবদ্ধতা দেখুন এবং যা আশা করেন না তা বের করার চেষ্টা করুন; (২) যে কোডটি অযাচিত বাধা বা সীমাবদ্ধতা যুক্ত করেছে এবং এটি সমাধান করে তা সন্ধান করুন। (দ্রষ্টব্য: আপনি যদি NSAutoresizingMaskLayoutConstraintsবুঝতে থাকেন যে আপনি বুঝতে পারছেন না, তবে UIViewসম্পত্তিটির জন্য ডকুমেন্টেশনটি দেখুন translatesAutoresizingMaskIntoConstraints) ()

সুতরাং, কীভাবে এটি এখনও ঠিক করবেন তা সম্পর্কে আমি নিশ্চিত নই, তবে এটি বিরক্তিকর হওয়ার পাশাপাশি কিছু ভাঙবে বলে মনে হয় না।

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


4
এটি iOS11 এ স্থির করা হয়েছে বলে মনে হয়, এখানে কোনও সতর্কতা না পেয়ে
ট্র্যাপার

উত্তর:


206

আপনি এই সমস্যাটি পান কারণ গোপনে কোনও সাবউভিউ সেট করার UIStackViewসময়, এটি সঞ্চারিত করতে প্রথমে এর উচ্চতা শূন্যের মধ্যে সীমাবদ্ধ রাখবে।

আমি নিম্নলিখিত ত্রুটি পেয়েছিলাম:

2015-10-01 11:45:13.732 <redacted>[64455:6368084] 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:0x7f7f5be18c80 V:[UISegmentedControl:0x7f7f5bec4180]-(8)-|   (Names: '|':UIView:0x7f7f5be69d30 )>",
    "<NSLayoutConstraint:0x7f7f5be508d0 V:|-(8)-[UISegmentedControl:0x7f7f5bec4180]   (Names: '|':UIView:0x7f7f5be69d30 )>",
    "<NSLayoutConstraint:0x7f7f5bdfbda0 'UISV-hiding' V:[UIView:0x7f7f5be69d30(0)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7f7f5be18c80 V:[UISegmentedControl:0x7f7f5bec4180]-(8)-|   (Names: '|':UIView:0x7f7f5be69d30 )>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

আমি যা করার চেষ্টা করছিলাম তা ছিল UIViewআমার মধ্যে UIStackViewএমন একটি জায়গা রাখা যা UISegmentedControlপ্রতিটি প্রান্তে 8 পিটিএস দ্বারা একটি ইনসেট ধারণ করে contained

আমি যখন এটি গোপনে সেট করি, তখন এটি ধারক দর্শনটি শূন্য উচ্চতায় সীমাবদ্ধ করার চেষ্টা করবে তবে আমার উপর থেকে নীচে পর্যন্ত সীমাবদ্ধতার একটি সেট রয়েছে, তাই সেখানে বিরোধ ছিল।

সমস্যাটি সমাধান করার জন্য, আমি আমার 8 টি শীর্ষের নীচে বাধাগুলির অগ্রাধিকারটি 1000 থেকে 999 এ পরিবর্তন করেছি যাতে UISV-hidingপ্রয়োজনে যদি সীমাবদ্ধতাটি অগ্রাধিকার নিতে পারে।


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

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

4
আমার ক্ষেত্রে, আমাকে কেবল উচ্চতার উপর অগ্রাধিকার কম করতে হবে এবং এটি কাজ করে।
পিক্সেলফ্রিয়াক

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

ধন্যবাদ! 1000 থেকে 999 এর অগ্রাধিকারটি কৌশলটি করেছে X এক্সকোড: সংস্করণ 8.3.3 (8E3004 বি)
মাইকেল গারিতো

54

আমার একই সমস্যা ছিল যা সমাধান করা সহজ ছিল না। আমার ক্ষেত্রে, আমার স্ট্যাক ভিউ এম্বেড থাকা একটি স্ট্যাক ভিউ ছিল। অভ্যন্তরীণ ইউআইএসট্যাকভিউতে দুটি লেবেল ছিল এবং একটি শূন্য নয় শূন্যস্থান নির্দিষ্ট করা আছে।

আপনি যখন addArrangedSubview () কল করবেন তখন এটি স্বয়ংক্রিয়ভাবে নিম্নলিখিতগুলির মতো সীমাবদ্ধতা তৈরি করবে:

V:|[innerStackView]|              | = outerStackView

  V:|[label1]-(2)-[label2]|       | = innerStackView

এখন আপনি যখন ইন্টারনস্ট্যাকভিউটি আড়াল করার চেষ্টা করবেন তখন আপনি একটি দ্ব্যর্থহীন সীমাবদ্ধতার সতর্কতা পেয়ে যাবেন।

কেন তা বোঝার জন্য, প্রথমে দেখি কেন সমান হলে এটি কেন হয় না । আপনি যখন কল করবেন , @ লিয়ামনিচলসটি সঠিক ছিল ... ইচ্ছাকৃতভাবে এই কলটি স্বীকার করবে এবং অগ্রাধিকার 1000 (প্রয়োজনীয়) সহ একটি উচ্চতা ইউআইএসভি-লুকানোর সীমাবদ্ধতা তৈরি করবে । সম্ভবত আপনার লুকানোর কোডটিকে কোনও ব্লকের মধ্যে কল করা হলে স্ট্যাক ভিউয়ের উপাদানগুলিকে অ্যানিমেটেড করার অনুমতি দেওয়া । দুর্ভাগ্যক্রমে, এই প্রতিবন্ধকতা যুক্ত হওয়া থেকে রোধ করার কোনও উপায় বলে মনে হচ্ছে না। তবুও, আপনি "একযোগে সীমাবদ্ধতাগুলি পূরণ করতে অক্ষম" (ইউএসএসসি) সতর্কতা পাবেন না, যেহেতু নিম্নলিখিতটি ঘটে:innerStackView.spacing0innerStackView.hidden = trueouterStackView0UIView.animationWithDuration()

  1. লেবেল 1 এর উচ্চতা 0 তে সেট করা আছে
  2. দুটি লেবেলের মধ্যে ব্যবধানটি ইতিমধ্যে 0 হিসাবে সংজ্ঞায়িত করা হয়েছিল
  3. লেবেল 2 এর উচ্চতা 0 তে সেট করা আছে
  4. ইনটারস্ট্যাকভিউয়ের উচ্চতা 0 তে সেট করা আছে

এই 4 টি বাধা সন্তুষ্ট হতে পারে তা দেখতে এটি স্পষ্ট। স্ট্যাক ভিউ কেবল 0-উচ্চতার পিক্সেলের মধ্যে সবকিছুকে স্মুশ করে।

এখন বগি উদাহরণটিতে ফিরে যাওয়া, আমরা যদি সেট করে spacingরাখি তবে 2আমাদের এখন এই সীমাবদ্ধতা রয়েছে:

  1. লেবেল 1 এর উচ্চতা 0 তে সেট করা আছে
  2. দুটি লেবেলের মধ্যে ব্যবধানটি স্বয়ংক্রিয়ভাবে স্ট্যাক ভিউ দ্বারা 1000 পিক্সেলের উচ্চতায় 2 পিক্সেল হিসাবে উচ্চতর তৈরি করা হয়েছিল।
  3. লেবেল 2 এর উচ্চতা 0 তে সেট করা আছে
  4. ইনটারস্ট্যাকভিউয়ের উচ্চতা 0 তে সেট করা আছে

স্ট্যাক ভিউ উভয়ই 0 পিক্সেল উচ্চ হতে পারে এবং এর সামগ্রী 2 পিক্সেল উচ্চ হতে পারে। সীমাবদ্ধতাগুলি সন্তুষ্ট করা যায় না।

দ্রষ্টব্য: আপনি সহজ আচরণের সাথে এই আচরণটি দেখতে পারেন। সজ্জিত সাবউভিউ হিসাবে স্ট্যাক ভিউতে কেবল একটি ইউআইভিউ যুক্ত করুন। তারপরে 1000 টি অগ্রাধিকার সহ সেই ইউআইভিউতে একটি উচ্চতার সীমাবদ্ধতা সেট করুন। এখন এটিতে লুকানোর চেষ্টা করুন।

দ্রষ্টব্য: যে কারণেই হোক না কেন, এটি তখনই ঘটেছিল যখন আমার স্ট্যাক ভিউটি কোনও ইউআইকোলিকেশনভিউসেল বা ইউআইটিএবলভিউসিলের একটি দর্শন ছিল। তবে, আপনি কল করেও এই আচরণটির পুনরায় উত্পাদন করতে পারেন cellinnerStackView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize) অভ্যন্তরীণ স্ট্যাক ভিউটি লুকিয়ে রেখে পরবর্তী রান লুপে করে ।

দ্রষ্টব্য: আপনি যদি কোনও ইউআইভিউ.পারফর্ম উইথআউটঅ্যানিমেশনগুলিতে কোডটি সম্পাদন করার চেষ্টা করেন, স্ট্যাক ভিউ এখনও 0 উচ্চতার সীমাবদ্ধতা যুক্ত করবে যা ইউএসএসসি সতর্কতার কারণ হবে।


এই সমস্যাটির কমপক্ষে 3 টি সমাধান রয়েছে:

  1. স্ট্যাক ভিউতে কোনও উপাদান আড়াল করার আগে এটি স্ট্যাক ভিউ কিনা তা পরীক্ষা করুন এবং যদি তা spacingহয় তবে 0 এ পরিবর্তন করুন । এ This এটি বিরক্তিকর কারণ আপনি যখনই সামগ্রীটি আবার দেখাবেন তখন আপনাকে প্রক্রিয়াটি বিপরীত করতে হবে (এবং মূল স্পেসিংটি মনে রাখবেন)।
  2. স্ট্যাক ভিউতে উপাদানগুলি লুকানোর পরিবর্তে কল করুন removeFromSuperviewএটি আরও বিরক্তিকর যেহেতু আপনি যখন প্রক্রিয়াটি বিপরীত করেন তখন আপনাকে কোথায় মনে রাখা উচিত to মুছে ফেলা আইটেমটি প্রবেশ করানো । আপনি কেবল রিমুভাল অ্যারেঞ্জডসউভিউ কল করে এবং তারপরে লুকিয়ে অপ্টিমাইজ করতে পারেন, তবে এখনও প্রচুর বুককিপিং রয়েছে যা করা দরকার।
  3. spacingকোনও ইউআইভিউতে নেস্টেড স্ট্যাক ভিউগুলি (যা শূন্য নয় ) মোড়ানো । অ-প্রয়োজনীয় অগ্রাধিকার হিসাবে কমপক্ষে একটি সীমাবদ্ধতা নির্দিষ্ট করুন (999 বা নীচে)। এটি কোনও সেরা সমাধান যেহেতু আপনাকে কোনও বুককিপিং করতে হবে না। আমার উদাহরণ হিসাবে, আমি স্ট্যাক ভিউ এবং মোড়কের দৃশ্যের মধ্যে 1000 এ শীর্ষ, শীর্ষস্থানীয় এবং পিছনের সীমাবদ্ধতা তৈরি করেছি, তারপরে স্ট্যাক ভিউয়ের নীচে থেকে মোড়কের দৃশ্যে একটি 999 সীমাবদ্ধতা তৈরি করেছি। এই ভাবে যখন বাইরের স্ট্যাক ভিউ শূন্য উচ্চতার সীমাবদ্ধতা তৈরি করে, 999 সীমাবদ্ধতা নষ্ট হয়ে যায় এবং আপনি ইউএসএসসি সতর্কতা দেখতে পাবেন না। (দ্রষ্টব্য: এটি কোনও ইউআইসিএল্লেশনভিউসেল সাবক্লাসের কনটেন্টভিউ.ট্রান্সলেটস অটো রিসাইজিংমাস্কটোক কনট্রেন্টস সেট করা উচিত এর সমাধানের মতোfalse )

সংক্ষেপে, আপনি এই আচরণটি পাওয়ার কারণগুলি হ'ল:

  1. আপনি স্ট্যাক দৃশ্যে পরিচালিত সাবভিউগুলি যুক্ত করলে অ্যাপল স্বয়ংক্রিয়ভাবে আপনার জন্য 1000 অগ্রাধিকারের সীমাবদ্ধতা তৈরি করে।
  2. আপনি যখন স্ট্যাক দর্শনটির একটি সংক্ষিপ্তসারটি লুকান তখন অ্যাপল স্বয়ংক্রিয়ভাবে আপনার জন্য 0-উচ্চতার সীমাবদ্ধতা তৈরি করে।

যদি অ্যাপল (1) আপনাকে বাধাগুলির (বিশেষত স্পেসারদের) অগ্রাধিকার নির্দিষ্ট করার অনুমতি দেয় বা (2) আপনাকে স্বয়ংক্রিয় ইউআইএসভি-লুকানোর বাধা থেকে অপ্ট আউট করার অনুমতি দেয় , তবে এই সমস্যাটি সহজেই সমাধান হয়ে যেত।


6
সুপার পুরোপুরি এবং সহায়ক ব্যাখ্যার জন্য ধন্যবাদ। এটি অবশ্যই স্ট্যাকের দৃশ্যের সাথে অ্যাপলের পাশের বাগের মতো মনে হচ্ছে। মূলত তাদের "লুকানো" বৈশিষ্ট্যটি তাদের "ফাঁকা" বৈশিষ্ট্যটির সাথে সামঞ্জস্যপূর্ণ নয়। তাদের যে কোনও ধারণাগুলি এটিকে সমাধান করেছে, বা অতিরিক্ত ধারণাগুলি সহ আশেপাশে হ্যাকিং রোধে কিছু বৈশিষ্ট্য যুক্ত করেছে? (আবারও, সম্ভাব্য সমাধানগুলির দুর্দান্ত ভাঙ্গন এবং # 3 এর কমনীয়তায় সম্মত হন)
মার্চ

4
আপনার প্রতিটি UIStackViewবাচ্চাকে কী লুকিয়ে রাখতে / লুকিয়ে রাখতে চাইছেন এমন UIStackViewএকটি UIViewবা কেবল একটিতে আবৃত করা দরকার ?
অ্যাড্রিয়ান

4
এটি অ্যাপলের পক্ষে সত্যিই খারাপ তদারকির মতো মনে হচ্ছে। বিশেষত কারণ সতর্কতা এবং ব্যবহারের চারপাশের ত্রুটিগুলি UIStackViewরহস্যজনক এবং বোঝা শক্ত হয়ে থাকে।
bompf

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

6

বেশিরভাগ সময়, দ্বন্দ্ব নির্মূল করার জন্য এই ত্রুটিটি সীমাবদ্ধতাগুলির অগ্রাধিকার কমিয়ে সমাধান করা যেতে পারে।


আপনি কি বোঝাতে চেয়েছেন? সীমাবদ্ধতাগুলি সমস্ত দৃশ্যের সাথে সম্পর্কিত যেগুলি স্ট্যাক করা আছে ....
বেন গিল্ড

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

দেখে মনে হচ্ছে যে জিনিসগুলি যখন স্কোয়াশ করা হয় বা দেখানো / গোপন করার প্রক্রিয়াতে আসে। এই ক্ষেত্রে, এটি আংশিকভাবে দৃশ্যমান হয়। - সম্ভবত কোনও নূন্যতম উল্লম্ব ধ্রুবকগুলির মধ্য দিয়ে যেতে হবে এবং এটি 0 উচ্চতায় স্কোয়ার করা যেতে পারে কেন?
বেন গিল্ড

2

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

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


1

@ সেনসুফুলের উত্তরের ভিত্তিতে, এখানে একটি ইউআইএসট্যাক ভিউ এক্সটেনশান একটি দৃশ্যে স্ট্যাক ভিউ মোড়ানো এবং তিনি বা তার প্রস্তাবিত প্রতিবন্ধকতাগুলি প্রয়োগ করুন:

/// wraps in a `UIView` to prevent autolayout warnings when a stack view with spacing is placed inside another stack view whose height might be zero (usually due to `hidden` being `true`).
/// See http://stackoverflow.com/questions/32428210
func wrapped() -> UIView {
    let wrapper = UIView()
    translatesAutoresizingMaskIntoConstraints = false
    wrapper.addSubview(self)

    for attribute in [NSLayoutAttribute.Top, .Left, .Right, .Bottom] {
        let constraint = NSLayoutConstraint(item: self,
                                            attribute: attribute,
                                            relatedBy: .Equal,
                                            toItem: wrapper,
                                            attribute: attribute,
                                            multiplier: 1,
                                            constant: 0)
        if attribute == .Bottom { constraint.priority = 999 }
        wrapper.addConstraint(constraint)
    }
    return wrapper
}

আপনার যুক্ত করার পরিবর্তে stackView, ব্যবহার করুন stackView.wrapped()


1

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

আপনি যদি এখনও সমস্যাটি অনুভব করছেন, তবে লুকানো স্ট্যাকভিউজে ফাঁক থাকার কারণে সমস্যাটি সম্ভবত হতে পারে। আমার সমাধানটি ছিল একটি ইউআইভিউউকে একটি স্পেসার হিসাবে যুক্ত করা এবং ইউআইএসট্যাকভিউ ফাঁককে শূন্যে সেট করা। তারপরে স্ট্যাকভিউয়ের ব্যবধানে View.height বা View.width সীমাবদ্ধতা (উল্লম্ব বা অনুভূমিক স্ট্যাকের উপর নির্ভর করে) সেট করুন।

তারপরে আপনার নতুন যুক্ত হওয়া ভিউগুলির সামগ্রীতে আলিঙ্গন এবং সামগ্রী সংক্ষেপণ প্রতিরোধের অগ্রাধিকারগুলি সামঞ্জস্য করুন। আপনাকে প্যারেন্ট স্ট্যাকভিউয়ের বিতরণও পরিবর্তন করতে হতে পারে।

উপরের সমস্তটি ইন্টারফেস বিল্ডারে করা যেতে পারে। আপনাকে অতিরিক্তভাবে নতুন কিছু যুক্ত করা প্রোগ্রামগুলি লুকিয়ে রাখা / গোপন রাখতে হতে পারে যাতে আপনার অযাচিত ব্যবধান নেই।


1

আমি যখন লুকিয়ে থাকি তখন আমি অটো লেআউট ত্রুটিগুলি নিয়ে কুস্তি করেছিলাম UIStackView। একত্রে বই রাখার এবং স্ট্যাকগুলি মোড়কে রাখার পরিবর্তে UIViews, আমি parentStackViewযে বাচ্চাদের আড়াল / লুকিয়ে রাখতে চাই তার জন্য আমার এবং আউটলেটগুলির জন্য একটি আউটলেট তৈরি করতে পছন্দ করেছি।

@IBOutlet weak var parentStackView: UIStackView!
@IBOutlet var stackViewNumber1: UIStackView!
@IBOutlet var stackViewNumber2: UIStackView!

স্টোরিবোর্ডে, আমার পিতামাতার স্ট্যাকটি দেখতে এখানে:

এখানে চিত্র বর্ণনা লিখুন

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

আমার উদাহরণে, parentStackViews4 টি উপাদানের একটি অ্যারে রয়েছে: শীর্ষ স্ট্যাক ভিউ, স্ট্যাকভিউ নাম্বার 1, স্ট্যাক ভিউ নম্বর 2 এবং স্টপ বোতাম। তাদের সূচকগুলি arrangedSubviewsযথাক্রমে 0, 1, 2 এবং 3। আমি যখন কোনওটি আড়াল করতে চাই তখন আমি এটিকে parentStackView's arrangedSubviewsঅ্যারে থেকে সরিয়ে ফেলি । যেহেতু এটি দুর্বল নয়, এটি স্মৃতিতে স্থির থাকে এবং আপনি এটি পরে আপনার পছন্দসই সূচীতে রেখে দিতে পারেন। আমি এটি পুনরায় পুনর্নির্মাণ করছি না, সুতরাং এটি প্রয়োজন না হওয়া পর্যন্ত কেবল স্থির থাকে তবে স্মৃতি ফেটে না।

সুতরাং মূলত, আপনি ...

1) আপনার পিতামাতার স্ট্যাক এবং আপনি যে স্টোরবোর্ডে লুকিয়ে রাখতে / লুকিয়ে রাখতে চান বাচ্চাদের জন্য আইবিআউটলেটগুলি টেনে আনুন।

2) আপনি যখন এগুলি আড়াল করতে চান তখন parentStackView's arrangedSubviewsঅ্যারে থেকে আপনি যে স্ট্যাকটি আড়াল করতে চান তা সরিয়ে ফেলুন ।

3) কল self.view.layoutIfNeeded()সঙ্গে UIView.animateWithDuration

সর্বশেষ দুটি স্ট্যাকভিউ নোট করুন weak। আপনি যখন এগুলি না দেখান তখন আপনার এগুলি চারপাশে রাখা দরকার।

ধরা যাক আমি স্ট্যাকভিউ নাম্বার 2 আড়াল করতে চাই:

parentStackView.removeArrangedSubview(stackViewNumber2)
stackViewNumber2.removeFromSuperview()

তারপরে এনিমেট করুন:

UIView.animate(withDuration: 0.25,
               delay: 0,
               usingSpringWithDamping: 2.0,
               initialSpringVelocity: 10.0,
               options: [.curveEaseOut],
               animations: {
                self.view.layoutIfNeeded()
},
               completion: nil)

আপনি যদি stackViewNumber2পরে "লুকোচুরি" করতে চান , আপনি কেবল এটি পছন্দসই parentStackView arrangedSubViewsসূচীতে sertোকাতে এবং আপডেটটি সঞ্চার করতে পারেন।

parentStackView.removeArrangedSubview(stackViewNumber1)
stackViewNumber1.removeFromSuperview()
parentStackView.insertArrangedSubview(stackViewNumber2, at: 1)

// Then animate it
UIView.animate(withDuration: 0.25,
               delay: 0,
               usingSpringWithDamping: 2.0,
               initialSpringVelocity: 10.0,
               options: [.curveEaseOut],
               animations: {
                self.view.layoutIfNeeded()
},
               completion: nil)

আমি খুঁজে পেয়েছি যে সীমাবদ্ধতাগুলিতে বুককিপিং করা, অগ্রাধিকারের সাথে ঝাঁকুনি দেওয়া ইত্যাদির চেয়ে অনেক সহজ কাজ to

আপনার যদি ডিফল্টরূপে গোপনীয় কিছু থাকে তবে আপনি এটি স্টোরিবোর্ডে রেখে দিতে পারেন viewDidLoadএবং এনিমেশনটি ব্যবহার না করেই সরিয়ে ফেলতে এবং আপডেট করতে পারেন view.layoutIfNeeded()


1

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

আমি isHidden = trueপ্যারেন্ট স্ট্যাক ভিউটি লুকানোর আগে সমস্ত সাব-স্ট্যাক ভিউগুলি প্রথমে (সেটিং ) আড়াল করে সীমাবদ্ধতা ত্রুটিগুলি সমাধান করেছি ।

এটি করার ক্ষেত্রে সাব অ্যারেঞ্জড ভিউগুলি সরিয়ে ফেলার সমস্ত জটিলতা ছিল না, যখন এগুলি আবার যুক্ত করার দরকার হয় তখন তার জন্য একটি সূচক বজায় রাখে।

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


1

সেনসফুল উপরের সমস্যার মূলটির একটি দুর্দান্ত উত্তর সরবরাহ করেছে তাই আমি সরাসরি সমাধানে যাব।

আপনাকে যা করতে হবে তা হ'ল সমস্ত স্ট্যাকভিউ সীমাবদ্ধতার অগ্রাধিকার 1000 এর চেয়ে কম (999 কাজ করবে)। উদাহরণস্বরূপ, যদি স্ট্যাকভিউটি তার তত্ত্বাবধানে বাম, ডান, উপরে এবং নীচে সীমাবদ্ধ থাকে তবে সমস্ত 4 টি সীমাবদ্ধতার অগ্রাধিকারটি 1000 এর চেয়ে কম হওয়া উচিত।


0

নির্দিষ্ট আকারের ক্লাস (উদাহরণস্বরূপ: wCompact hRegular) এর সাথে কাজ করার সময় আপনি একটি সীমাবদ্ধতা তৈরি করতে পারেন এবং তারপরে আপনি অন্য আকারের ক্লাসে স্যুইচ করার সময় একটি নকল তৈরি করেছেন (যেমন: wAny hAny)। বিভিন্ন আকারের শ্রেণিতে UI অবজেক্টের সীমাবদ্ধতাগুলি পরীক্ষা করে দেখুন এবং সীমাবদ্ধতার সাথে অসঙ্গতি রয়েছে কিনা তা দেখুন। সংঘাতের সীমাবদ্ধতাগুলি নির্দেশ করে এমন লাল রেখা দেখতে হবে। আমি 10 টি খ্যাতি পয়েন্ট না পাওয়া পর্যন্ত আমি কোনও ছবি রাখতে পারি না: /


ওহ ঠিক আছে. কিন্তু আমি যে ত্রুটি পেয়েছিলাম যখন আমি যদি আমি বর্ণনা ছিল drive.google.com/file/d/0B-mn7bZcNqJMVkt0OXVLVVdnNTA/...
এফ এম

হ্যাঁ, আমি অবশ্যই ইন্টারফেস বিল্ডারে টগলিং আকারের ক্লাস করে কোনও লাল দেখতে পাচ্ছি না। আমি কেবল "যে কোনও" আকার ব্যবহার করেছি।
বেন গিল্ড

0

আমি একবারে পুরো ইউআইএসট্যাকভিউ লুকিয়ে রাখতে চেয়েছিলাম কিন্তু আমি ওপি'র মতো একই ত্রুটি পাচ্ছিলাম, এটি আমার জন্য এটি ঠিক করে দিয়েছে:

for(UIView *currentView in self.arrangedSubviews){
    for(NSLayoutConstraint *currentConstraint in currentView.constraints){
        [currentConstraint setPriority:999];
    }
}

এটি আমার পক্ষে কার্যকর হয়নি কারণ আপনি যখন প্রয়োজনীয় সীমাবদ্ধতা ( priority = 1000) পরিবর্তন না করেন তখন অটো লেআউট ইঞ্জিন অভিযোগ করে priority <= 999
সংবেদনশীল

0

উচ্চতার বাধা নিয়ে আমার একটি সারি বোতাম ছিল। এটি ঘটে যখন একটি বোতাম লুকানো থাকে। বাটনগুলির উচ্চতার সীমাবদ্ধতার অগ্রাধিকারটি 999 এ সেট করা সমস্যার সমাধান করেছে have


-2

এই ত্রুটির ইউআইএসট্যাকভিউয়ের সাথে কোনও সম্পর্ক নেই। যখন আপনার একই অগ্রাধিকারগুলির সাথে দ্বন্দ্ব বাধা থাকে তখনই এটি ঘটে happens উদাহরণস্বরূপ, যদি আপনার কোনও সীমাবদ্ধতা থাকে তবে দেখায় যে আপনার দর্শনটির প্রস্থ 100 রয়েছে এবং একই সাথে আপনার আরও একটি প্রতিবন্ধকতা রয়েছে যে দেখায় যে প্রস্থটির প্রস্থটি তার ধারকটির 25%। স্পষ্টত দুটি বিবাদযুক্ত বাধা আছে। সমাধানটি হ'ল সেগুলি মুছে ফেলা।


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