লুকানো ইউআইভিউগুলির সাথে অটোলআউট?


164

আমি মনে করি এটি ব্যবসায়ের যুক্তির উপর নির্ভর করে UIViewsবেশিরভাগ ক্ষেত্রে দেখা / আড়াল করা মোটামুটি সাধারণ দৃষ্টান্ত UILabels। আমার প্রশ্ন হ'ল লুকানো ভিউগুলিকে প্রতিক্রিয়া জানাতে অটলআউটটি ব্যবহার করার সর্বোত্তম উপায়টি যা তাদের ফ্রেম 0x0। এখানে 1-3 বৈশিষ্ট্যের গতিশীল তালিকার একটি উদাহরণ রয়েছে।

গতিশীল বৈশিষ্ট্যগুলির তালিকা

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

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

সত্য সত্য যদিও, কেবল লুকানো দৃশ্যের প্রসঙ্গ থেকে ধ্রুবকটি পরিবর্তন করার জন্য সাধারণ গণনা সহ একক লাইন কোডের প্রয়োজন requires নতুন সীমাবদ্ধতাগুলির সাথে constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:পুনরুদ্ধার করা এত ভারী বলে মনে হচ্ছে।

ফেব্রুয়ারী সম্পাদনা 2018 : সঙ্গে বেন দেখি উত্তর UIStackViewগুলি


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

উত্তর:


82

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


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

7
স্ট্যাক ভিউ এটি কীভাবে পরিচালনা করে তার একটি ছোট্ট উদাহরণ দেওয়া ভাল হবে।
ট্রান্সলেশন

@ কেন্টো এই আইওএস 10 এ এখনও একটি সমস্যা?
ক্র্যাশলোট

3
পাঁচ বছর পরে ... আমি কি আপডেট করে এটিকে গ্রহণযোগ্য উত্তর হিসাবে সেট করব? এটি এখন তিনটি মুক্তির জন্য উপলব্ধ হয়েছে available
রায়ান রোমানচুক

1
@ রায়ানরমনচুক আপনার উচিত, এটি অবশ্যই এখন সেরা উত্তর। ধন্যবাদ বেন!
ডানকান লুক

234

দেখানোর / লুকানোর জন্য আমার ব্যক্তিগত পছন্দটি উপযুক্ত প্রস্থ বা উচ্চতার সীমাবদ্ধতার সাথে একটি আইবিআউটলেট তৈরি করা।

আমি তখন constantমানটি 0আড়াল করতে আপডেট করি বা মানটি যা দেখানো উচিত তা আপডেট করি ।

এই কৌশলটির বড় সুবিধা হ'ল আপেক্ষিক সীমাবদ্ধতা বজায় রাখা হবে। উদাহরণস্বরূপ যাক ধরুন আপনার একটি অনুভূমিক ফাঁক দিয়ে দৃশ্য A এবং দৃশ্য বি আছে এক্স । যখন কোনও প্রস্থের দর্শন constantসেট করা থাকে 0.fতখন ভি বিটি সেই স্থানটি পূরণ করতে বাম দিকে সরে যাবে।

বাধা যুক্ত করতে বা অপসারণ করার দরকার নেই, এটি একটি হেভিওয়েট অপারেশন। কেবল সীমাবদ্ধতার আপডেট করা constantকৌশলটি করবে।


1
ঠিক। যতক্ষণ না - এই উদাহরণে - আপনি একটি অনুভূমিক ফাঁক ব্যবহার করে ভি এর ডানদিকে ভি দেখুন position আমি এই কৌশলটি সব সময় ব্যবহার করি এবং এটি খুব ভালভাবে কাজ করে
ম্যাক্স ম্যাকলিউড

9
@ ম্যাক্সম্যাকলিউড ঠিক তা নিশ্চিত করার জন্য: যদি উভয় মতামতের মধ্যে ব্যবধানটি x হয় তবে ভিউ বি থেকে একটি অবস্থানের অবস্থান শুরু হওয়ার জন্য, আমাদেরও ফাঁকের সীমাবদ্ধতা ধীরে ধীরে 0 তে পরিবর্তন করতে হবে, তাই না?
কর্নিক্স

1
@ কার্নিক্স হ্যাঁ যদি দুটি মতামতের মধ্যে অনুভূমিক ব্যবধানের সীমাবদ্ধতা প্রয়োজন হয়। ধ্রুব 0 অবশ্যই অবশ্যই কোনও ফাঁক নেই। সুতরাং ভিউ এটিকে প্রস্থে 0 এ সেট করে লুকিয়ে রাখলে ভিউ বিটি বদ্ধ হয়ে কনটেইনারটির সাথে ফ্ল্যাশ হতে থাকবে। বিটিডব্লিউ আপ আপ ভোটের জন্য ধন্যবাদ!
ম্যাক্সলিউড

2
@ ম্যাক্সম্যাকলিউড আপনার উত্তরের জন্য ধন্যবাদ। আমি অন্যান্য ইউআইভিউ দিয়ে এটি করার চেষ্টা করেছি যাতে অন্যান্য মতামত রয়েছে তবে আমি এর উচ্চতার সীমাবদ্ধতা 0 এ সেট করার সময় এই দৃশ্যের সংক্ষিপ্ত বিবরণগুলি লুকানো থাকে না এই সমাধানটি কি সাবউভিউ যুক্ত দর্শনগুলির সাথে কাজ করার কথা? ধন্যবাদ!
শানলিম


96

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

আমার আরও ভাল সমাধান আছে।

ধারণাটি হ'ল 0 টি উচ্চতার নিয়মটি যখন আমরা উপাদানটিকে আড়াল করি তখন উচ্চ অগ্রাধিকারের জন্য সেট করতে হয় যাতে এটি কোনও স্বয়ংচালিত স্থান না নেয়।

আপনি এটি কীভাবে করেন তা এখানে:

1. কম অগ্রাধিকার সহ ইন্টারফেস বিল্ডারে 0 এর প্রস্থ (বা উচ্চতা) সেট করুন।

প্রস্থ 0 নিয়ম নির্ধারণ

ইন্টারফেস বিল্ডার দ্বন্দ্ব সম্পর্কে চিত্কার করবেন না কারণ অগ্রাধিকারটি কম। অস্থায়ীভাবে 999- এ অগ্রাধিকার সেট করে উচ্চতার আচরণটি পরীক্ষা করুন (1000 এটিকে প্রোগ্রাম্যাটিকভাবে রূপান্তর করতে নিষেধ করা হয়েছে, তাই আমরা এটি ব্যবহার করব না)। ইন্টারফেস নির্মাতারা এখন সম্ভবত বিরোধমূলক বাধা সম্পর্কে চিত্কার করবেন। আপনি 900 বা ততোধিক বিষয়গুলিতে অগ্রাধিকার স্থাপন করে এগুলি ঠিক করতে পারেন।

২. একটি আউটলেট যুক্ত করুন যাতে আপনি কোডের প্রস্থের সীমাবদ্ধতার অগ্রাধিকারটি পরিবর্তন করতে পারেন:

আউটলেট সংযোগ

৩. আপনি যখন নিজের উপাদানটি আড়াল করবেন তখন অগ্রাধিকারটি সামঞ্জস্য করুন:

cell.alertTimingView.hidden    = place.closingSoon != true
cell.alertTimingWidth.priority = place.closingSoon == true ? 250 : 999

@ সিম্পলজি আপনি দয়া করে আমাকে বলতে পারেন এই জায়গাটি কী? ক্লোজিংসুন?
নিহারিকা

এটি সাধারণ সমাধানের অংশ নয়, @ নীহারিকা, আমার ক্ষেত্রে ব্যবসায়ের নিয়মটি ঠিক এটি ছিল (রেস্তোঁরাটি শীঘ্রই বন্ধ হচ্ছে না / হয় না তা দেখুন।
সিম্পলজি

11

এই ক্ষেত্রে আমি লেখকের লেবেলের উচ্চতাটিকে একটি উপযুক্ত আইবিউলেটলে ম্যাপ করব:

@property (retain, nonatomic) IBOutlet NSLayoutConstraint* authorLabelHeight;

এবং যখন আমি সীমাবদ্ধতার উচ্চতা 0.0f এ সেট করি, আমরা "প্যাডিং" সংরক্ষণ করি কারণ প্লে বোতামটির উচ্চতা এটির জন্য অনুমতি দেয়।

cell.authorLabelHeight.constant = 0; //Hide 
cell.authorLabelHeight.constant = 44; //Show

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


9

এখানে অনেকগুলি সমাধান রয়েছে তবে আমার স্বাভাবিক পদ্ধতিটি আবার আলাদা :)

জর্জি আরিমানির এবং টিমিনের উত্তরের মতো দুটি সীমাবদ্ধতার সেট সেট করুন:

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

তিনটি চিহ্নিত প্রতিবন্ধকের কনস্ট্যান্টের জন্য একই মান রয়েছে। A1 এবং A2 চিহ্নিত সীমাবদ্ধতাগুলির অগ্রাধিকারটি 500 এ সেট করা হয়েছে, এবং বি হিসাবে চিহ্নিত সীমাবদ্ধতাটির অগ্রাধিকারটি 250 (অথবা UILayoutProperty.defaultLowকোডে) এ সেট করা হয়েছে ।

আই আইউউটলেটে সীমাবদ্ধতা বি হুক করুন। তারপরে আপনি যখন উপাদানটি আড়াল করবেন তখন আপনাকে সীমাবদ্ধতা অগ্রাধিকারটি উচ্চ (750) এ সেট করতে হবে:

constraintB.priority = .defaultHigh

কিন্তু উপাদানটি দৃশ্যমান হলে, অগ্রাধিকারটি কম (250) এ ফিরে আসুন:

constraintB.priority = .defaultLow

isActiveক্ষণস্থায়ী বিয়ের পরিবর্তে এই পদ্ধতির (স্বীকারোক্তিকভাবে) সুবিধাটি হ'ল যদি ক্ষণস্থায়ী উপাদানটি অন্য উপায়ে দৃষ্টিভঙ্গি থেকে সরানো হয় তবে আপনার কাছে এখনও কাজ করার প্রতিবন্ধকতা রয়েছে।


স্টোরিবোর্ডে এবং কোডের উপাদানগুলির উচ্চতা / প্রস্থের মতো সদৃশ মান না রাখার সুবিধা রয়েছে। খুবই ভদ্র.
রবিন ডৌহার্টি

ধন্যবাদ !! এটি আমাকে সহায়তা করেছিল
পার্থ বারোট

দুর্দান্ত দৃষ্টিভঙ্গি, আপনাকে ধন্যবাদ
বাসিল

5

সাবক্লাসটি দেখুন এবং ওভাররাইড করুন func intrinsicContentSize() -> CGSizeCGSizeZeroদৃশ্যটি লুকিয়ে থাকলে কেবল ফিরে আসুন।


2
এটা অসাধারণ. কিছু UI উপাদানগুলির invalidateIntrinsicContentSizeযদিও একটি ট্রিগার প্রয়োজন । আপনি একটি ওভাররাইডে এটি করতে পারেন setHidden
DrMickeyLauer

5

আমি সবেমাত্র জানতে পেরেছিলাম যে কোনও ইউআইএলবেল স্থান না নেওয়ার জন্য আপনাকে এটি লুকিয়ে রাখতে হবে এবং এর পাঠ্যটি খালি স্ট্রিংয়ে সেট করতে হবে। (আইওএস 9)

এই সত্যটি / বাগটি জেনে কিছু লোককে তাদের লেআউটগুলি সহজতর করতে সহায়তা করতে পারে, সম্ভবত এটি মূল প্রশ্নটিও হতে পারে, তাই আমি বুঝতে পেরেছিলাম যে আমি এটি পোস্ট করব।


1
আমি মনে করি না যে আপনার এটি লুকিয়ে রাখা দরকার। একটি খালি স্ট্রিংয়ে এর পাঠ্য সেট করা যথেষ্ট হবে।
রব ভিএস

4

আমি আশ্চর্য হয়েছি যে UIKitএই কাঙ্ক্ষিত আচরণের জন্য সরবরাহ করা আরও মার্জিত পদ্ধতির নেই । এটি করতে সক্ষম হওয়াই খুব সাধারণ জিনিস বলে মনে হচ্ছে।

যেহেতু বাধার সাথে সংযোগগুলি সংযোগ IBOutletsস্থাপন করে 0এবং NSLayoutConstraintইয়াকিকে অনুভূত করে (এবং যখন আপনার দৃশ্যের সাথে পূর্বরূপগুলি দেওয়া হয়েছিল তখন হুঁশিয়ারি তৈরি হয়েছিল), তাই আমি এমন একটি এক্সটেনশন তৈরি করার সিদ্ধান্ত নিয়েছি যা অটো লেআউটের সীমাবদ্ধতাগুলি লুকানোর / দেখানোর ক্ষেত্রে একটি সরল, রাষ্ট্রীয় দৃষ্টিভঙ্গি দেয় IUIView

এটি কেবল দর্শন লুকায় এবং বাহ্যিক বাধা সরিয়ে দেয়। আপনি যখন আবার দর্শনটি দেখান, এটি আবার সীমাবদ্ধতাগুলি যুক্ত করে। একমাত্র সতর্কতা হ'ল আপনাকে আশেপাশের দর্শনে নমনীয় ব্যর্থতা সীমাবদ্ধতা নির্দিষ্ট করতে হবে।

সম্পাদনা করুন এই উত্তরটি iOS 8.4 এবং নীচে লক্ষ্যযুক্ত। আইওএস 9-এ, কেবলমাত্র UIStackViewপদ্ধতির ব্যবহার করুন ।


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

@ ড্যানিয়েলস্ক্লাগ তা নির্দেশ করার জন্য ধন্যবাদ Thanks আমি লাইসেন্সটি এমআইটিতে আপডেট করেছি। যাইহোক, প্রতিবার কেউ যখন এই সমাধানটি প্রয়োগ করে তখনই আমার মানসিক উচ্চ-পাঁচ প্রয়োজন।
অ্যালবার্ট বোরি

4

সর্বোত্তম অনুশীলনটি হ'ল একবার, যখন সমস্ত কিছুর সঠিক লেআউটের সীমাবদ্ধতা হয়ে যায়, উচ্চতা যুক্ত করুন বা সীমাবদ্ধতার সাথে, আপনি কীভাবে আশেপাশের দৃষ্টিভঙ্গি সরিয়ে নিতে চান এবং কোনও সীমাবদ্ধতার সাথে কোনও IBOutletসম্পত্তিতে সংযোগ স্থাপন করতে চান depending

আপনার সম্পত্তি আছে তা নিশ্চিত করুন strong

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

যদি গোপনীয় বিষয়বস্তুগুলি গোষ্ঠীভুক্ত করা হয় তবে সর্বোত্তম অনুশীলন হ'ল সকলকে একটি দৃশ্যে রাখুন এবং সেই দৃশ্যে বাধা যুক্ত করা practice

@property (strong, nonatomic) IBOutlet UIView *myContainer;
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *myContainerHeight; //should be strong!!

-(void) showContainer
{
    self.myContainerHeight.active = NO;
    self.myContainer.hidden = NO;
    [self.view layoutIfNeeded];
}
-(void) hideContainer
{
    self.myContainerHeight.active = YES;
    self.myContainerHeight.constant = 0.0f;
    self.myContainer.hidden = YES;
    [self.view layoutIfNeeded];
}

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


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

3

সীমাবদ্ধতাগুলি সহজে আপডেট করার জন্য আমি বিভাগটি তৈরি করি:

[myView1 hideByHeight:YES];

এখানে উত্তর দিন: অটোলেআউট ইউআইভিউ লুকান: এটি আপডেট করার জন্য কীভাবে বিদ্যমান এনএসএলআউটকন্ট্রেন্ট পাবেন?

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


8
দুর্ভাগ্যক্রমে আপনি সেখানে একটি দ্বিগুণ ব্যবধান পেয়েছেন, কেবল যেখানে হলুদ তীরটি নির্দেশ করে।
জোল্টন

উপরের অন্যান্য সমাধানগুলির মতো, আমিও মনে করি। মোটেই আদর্শ নয়।
বেনজহান

2

আমার পছন্দের পদ্ধতিটি জর্জি আরিমানির প্রস্তাবিত অনুরূপ similar

আমি একাধিক প্রতিবন্ধকতা তৈরি করতে পছন্দ করি। দ্বিতীয় লেবেলটি দৃশ্যমান হওয়ার জন্য প্রথমে আপনার সীমাবদ্ধতা তৈরি করুন। বোতাম এবং 2 য় লেবেলের মধ্যে সীমাবদ্ধতার জন্য একটি আউটলেট তৈরি করুন (যদি আপনি অবজেক্ট ব্যবহার করছেন তবে এটির দৃ its়তা নিশ্চিত করুন)। এই সীমাবদ্ধতাটি দৃশ্যমান হওয়ার পরে বোতাম এবং দ্বিতীয় লেবেলের মধ্যকার উচ্চতা নির্ধারণ করে।

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

অবশেষে আপনি যখন দ্বিতীয় লেবেলটি আড়াল করবেন তখন .isActiveএই সীমাবদ্ধতার সম্পত্তি টগল করুন এবং কল করুনsetNeedsDisplay()

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

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

আমি একটি সহজ উদাহরণ তৈরি করেছি, আমি আশা করি এটি কার্যকর ...

import UIKit

class ViewController: UIViewController {

    @IBOutlet var ToBeHiddenLabel: UILabel!


    @IBOutlet var hiddenConstraint: NSLayoutConstraint!
    @IBOutlet var notHiddenConstraint: NSLayoutConstraint!


    @IBAction func HideMiddleButton(_ sender: Any) {

        ToBeHiddenLabel.isHidden = !ToBeHiddenLabel.isHidden
        notHiddenConstraint.isActive = !notHiddenConstraint.isActive
        hiddenConstraint.isActive = !hiddenConstraint.isActive

        self.view.setNeedsDisplay()
    }
}

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


0

আমি আমার সমাধানটিও সরবরাহ করব, বিভিন্ন প্রস্তাব দেই)) আমি মনে করি ব্যবধানের জন্য প্রতিটি আইটেমের প্রস্থ / উচ্চতা প্লাসের জন্য একটি আউটলেট তৈরি করা কেবল হাস্যকর এবং কোড, সম্ভাব্য ত্রুটি এবং জটিলতার সংখ্যাটি ফুটিয়ে তুলেছে।

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

// remove all views
[self.twitterImageView removeFromSuperview];
[self.localQuestionImageView removeFromSuperview];

// self.recipients always has to be present
NSMutableArray *items;
items = [@[self.recipients] mutableCopy];

// optionally add the twitter image
if (self.question.sharedOnTwitter.boolValue) {
    [items addObject:self.twitterImageView];
}

// optionally add the location image
if (self.question.isLocal) {
    [items addObject:self.localQuestionImageView];
}

UIView *previousItem;
UIView *currentItem;

previousItem = items[0];
[self.contentView addSubview:previousItem];

// now loop through, add the items and the constraints
for (int i = 1; i < items.count; i++) {
    previousItem = items[i - 1];
    currentItem = items[i];

    [self.contentView addSubview:currentItem];

    [currentItem mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.centerY.equalTo(previousItem.mas_centerY);
        make.right.equalTo(previousItem.mas_left).offset(-5);
    }];
}


// here I just connect the left-most UILabel to the last UIView in the list, whichever that was
previousItem = items.lastObject;

[self.userName mas_remakeConstraints:^(MASConstraintMaker *make) {
    make.right.equalTo(previousItem.mas_left);
    make.leading.equalTo(self.text.mas_leading);
    make.centerY.equalTo(self.attachmentIndicator.mas_centerY);;
}];

আমি পরিষ্কার, নিয়মিত লেআউট এবং স্পেসিং পেয়েছি। আমার কোডটি রাজমিস্ত্রি ব্যবহার করে, আমি দৃ strongly়ভাবে এটির প্রস্তাব দিই: https://github.com/SnapKit/Masonry


0

বক্সভিউ চেষ্টা করে দেখুন , এটি গতিশীল বিন্যাসকে সংক্ষিপ্ত এবং পাঠযোগ্য করে তোলে।
আপনার ক্ষেত্রে এটি হয়:

    boxView.optItems = [
        firstLabel.boxed.useIf(isFirstLabelShown),
        secondLabel.boxed.useIf(isSecondLabelShown),
        button.boxed
    ]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.