যখন কোনও ভিউ লুকানো থাকে তখন অন্যান্য দর্শনগুলি সরানোর জন্য কীভাবে অটো-লেআউট ব্যবহার করবেন?


333

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

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(IndexPath *)indexPath {
...
Record *record = [self.records objectAtIndex:indexPath.row];

if ([record.imageURL is equalToString:@""]) {
     cell.cdView.hidden = YES;
}

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

কোষ

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

.....

মান রানটাইমের সীমাবদ্ধতা পরিবর্তন করুন - এই উত্তরটি দেখুন
কাম্পাই

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

উত্তর:


373

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

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

আপনার ক্ষেত্রে এটির অর্থ সম্ভবত:

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

আপনার যা করা দরকার তা হ'ল আপনার লেবেলগুলিকে অত্যধিক সীমাবদ্ধ করা । আপনার বিদ্যমান সীমাবদ্ধতাগুলি (অন্য দর্শনে 10pts স্থান) একা ছেড়ে যান, তবে আরও একটি প্রতিবন্ধকতা যুক্ত করুন: আপনার লেবেলের বাম প্রান্তগুলি তাদের তত্ত্বাবধানের বাম প্রান্ত থেকে 10pts দূরে একটি অ-প্রয়োজনীয় অগ্রাধিকার দিয়ে করুন (ডিফল্ট উচ্চ অগ্রাধিকার সম্ভবত ভালভাবে কাজ করবে)।

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

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


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

আমার মতে, এটি যাওয়ার উপায় নয়। আপনি যে দৃশ্যটি আড়াল করতে চান তার পরিবর্তে আপনার প্রশস্ততা / উচ্চতা-সীমাবদ্ধতা ব্যবহার করা উচিত।
ullstrm

26
আমি শ্রদ্ধার সাথে একমত। যদি আপনি (উদাহরণস্বরূপ) ভিউটির প্রস্থকে 0 এ সেট করেন তবে আপনি দুটি সমস্যার মধ্যে চলে যাবেন। প্রথমত, আপনার এখন সুপারভিউ এবং দৃশ্যমান দৃশ্যের মধ্যে দ্বিগুণ ব্যবধান রয়েছে: |-(space)-[hidden(0)]-(space)-[visible]কার্যকরভাবে |-(2*space)-[visible]। দ্বিতীয়ত, এই দৃশ্যটি তার নিজের ভিউ সাবট্রি এবং সীমাবদ্ধতার উপর নির্ভর করে সীমাবদ্ধতা লঙ্ঘন ছুড়ে দেওয়া শুরু করতে পারে - আপনি গ্যারান্টি দিতে পারবেন না যে আপনি নির্বিচারে 0 প্রস্থে একটি ভিউ সীমাবদ্ধ করতে পারেন এবং এটি কাজ চালিয়ে যেতে পারেন।
টিম

1
আপনি যদি অভ্যন্তরীণ সামগ্রীর আকারের সাথে একটি ভিউ ব্যবহার করছেন তবে টিমের উত্তরটি অনন্য যাওয়ার মতো বলে মনে হচ্ছে।
বালকোথ

ধন্যবাদ টিম সীমাবদ্ধতা অসুবিধাগুলি এড়াতে আমি উচ্চতর অগ্রাধিকার সহ 0 এর প্রতিবন্ধকতা সেট করেছি, তবে এখন আমি বুঝতে পেরেছি যে দ্বিগুণ ব্যবধানে সমস্যা রয়েছে। আমার কোনও সমস্যা হয়নি কারণ আমি কখনই দু'টি মতামত একসাথে দেখি না (আমার ক্ষেত্রে |-[otherViews]-[eitherThis][orThis]-|:), তবে শেষ পর্যন্ত আমি এই সমস্যায় পড়ে যাব।
ফেরান মেলিনঞ্চ

207

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

আপনি যে আড়াল করতে চান তার জন্য একটি প্রস্থের সীমাবদ্ধতা সেট করুন। অন্যান্য দৃশ্যের সাথে সেই দৃশ্যের শীর্ষস্থানীয় অনুভূমিক ফাঁক দিয়ে সীমাবদ্ধ রাখুন।

আড়াল করতে, .constantপ্রস্থের সীমাবদ্ধতার মান 0.f তে আপডেট করুন অন্যান্য মতামত অবস্থান ধরে নিতে স্বয়ংক্রিয়ভাবে বাম দিকে সরানো হবে।

আরও তথ্যের জন্য আমার অন্যান্য উত্তর এখানে দেখুন:

রানটাইম চলাকালীন লেবেলের সীমাবদ্ধতা কীভাবে পরিবর্তন করবেন?


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

2
@ skinsfan00atg আপনি যদি অভ্যন্তরীণ সামগ্রীর আকারের সাথে কোনও ভিউ ব্যবহার করেন তবে আপনি এই সমাধানটি ব্যবহার করতে পারবেন না।
বালকোথ

2
@ ম্যাক্সম্যাকলিউড যদি আপনি বিষয়বস্তু আলিঙ্গনকে অগ্রাধিকার হ্রাস করেন তবে আপনি অভ্যন্তরীণ সামগ্রীর আকার ব্যবহার করছেন না, আপনি সীমাবদ্ধতার দ্বারা নির্দেশিত আকারটি ব্যবহার করছেন।
বালকোথ

2
@ ম্যাক্সম্যাকলিউড ঠিক আছে, আপনি যা বলতে চাইছেন তা পেয়েছি। আপনি যখন ভিউটি আড়াল করতে চান এবং যখন আপনি আবার সেই মানটি পুনরুদ্ধার করতে চান তখন কোডটিতে সংকোচনের প্রতিরোধের অগ্রাধিকার সেট করতে হবে (সামগ্রীতে জড়িয়ে থাকা নয়) in এ ছাড়া ভিউটির আকারটি 0 এ সেট করতে আপনাকে ইন্টারফেস বিল্ডারে একটি সীমাবদ্ধতা যুক্ত করতে হবে কোডটিতে এই কনট্রিন্টটি স্পর্শ করার দরকার নেই।
বালকোথ

1
এটি আসলে আমার পক্ষে কাজ করে, আপনাকে অনেক ধন্যবাদ
FritzB

87

যারা কেবল আইওএস 8+ সমর্থন করেন তাদের জন্য একটি নতুন বুলিয়ান সম্পত্তি সক্রিয় রয়েছে । এটি গতিশীলভাবে কেবল প্রয়োজনীয় সীমাবদ্ধতা সক্ষম করতে সহায়তা করবে

পিএস কনস্ট্রেন্টের আউটলেট অবশ্যই শক্তিশালী , দুর্বল নয়

উদাহরণ:

@IBOutlet weak var optionalView: UIView!
@IBOutlet var viewIsVisibleConstraint: NSLayoutConstraint!
@IBOutlet var viewIsHiddenConstraint: NSLayoutConstraint!

func showView() {
    optionalView.isHidden = false
    viewIsVisibleConstraint.isActive = true
    viewIsHiddenConstraint.isActive = false
}

func hideView() {
    optionalView.isHidden = true
    viewIsVisibleConstraint.isActive = false
    viewIsHiddenConstraint.isActive = true
}

স্টোরিবোর্ডে একটি ত্রুটি সমাধানের জন্য আপনাকে Installedএই প্রতিবন্ধকতাগুলির একটির জন্য চেকবক্সটি নির্বাচন থেকে বের করতে হবে।

ইউআইএসট্যাকভিউ (আইওএস 9+) এর
মধ্যে আরও একটি বিকল্প হ'ল আপনার মতামতগুলি মোড়ানো UIStackView। একবার লুকানো হয়ে গেলে UIStackViewস্বয়ংক্রিয়ভাবে লেআউট আপডেট হবে


সক্রিয় আংশিকভাবে কাজ করে। তবে আমি যদি এটি পুনরায় ব্যবহারযোগ্য ঘরের মধ্যে ব্যবহার করি তবে সক্রিয়করণ থেকে নিষ্ক্রিয় করা, কাজ করে তবে অ্যাক্টিভেট করার জন্য নিষ্ক্রিয় করার জন্য না for কোন ধারনা? অথবা আপনি একটি উদাহরণ দিতে পারে?
আওক লি

10
এটি ঘটে থাকে কারণ নিষ্ক্রিয় সীমাবদ্ধতা লোড হয় না বা সরে যায়। আপনার সীমাবদ্ধতার আউটলেটটি শক্তিশালী হওয়া উচিত, দুর্বল নয়
সিলমারিল

আমরা "সক্রিয়" সম্পত্তিটি কোথায় পাব?
লক্ষ্মী রেড্ডি


মনে হচ্ছে ওভার-সীমাবদ্ধতা + সেট সীমাবদ্ধতা কার্যকলাপটি সবচেয়ে যুক্তিসঙ্গত উত্তর হতে পারে।
টিং ইয়ি শিহ

68

UIStackViewhiddenসম্পত্তিটি তার যে কোনও সাবউভিউ (আইওএস 9+) এর পরিবর্তিত হলে স্বয়ংক্রিয়ভাবে তার দর্শনগুলি প্রতিস্থাপন করে।

UIView.animateWithDuration(1.0) { () -> Void in
   self.mySubview.hidden = !self.mySubview.hidden
}

ঝাঁপ দাও 11:48 একটি ডেমো জন্য এই WWDC ভিডিওতে:

অটো লেআউট এর রহস্য, পর্ব 1


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

5
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। ইন্টারফেস বিল্ডার ডিজাইনে ডাব্লুডব্লিউডিসি 2015 এর আপেল পুনঃনির্মাণ অনুসরণ করছেন।
থাইবাট নোয়া

@thibutnoah এবং আইওএস 8- এর পরে কী?
ব্যাগেজ

5
@ ব্যাগ আপনি ফেসবুক বা গুগল না থাকলে আপনি এটিকে ফেলে দিতে পারেন। বেওং আইওএস 9 এর কভারেজের সাহায্যে আপনি 90% এরও বেশি ডিভাইস সমর্থন করবেন, পর্যাপ্ত পরিমাণে। নীচে সমর্থন করা আপনার বিকাশ প্রক্রিয়াটিকে পঙ্গু করবে এবং সর্বশেষ বৈশিষ্ট্যগুলি ইমো ব্যবহার থেকে আপনাকে বিরত করবে
থাইবুত নোহ

16

আমার প্রকল্পের (রঙ, ফন্ট, ইনসেট ইত্যাদির ধারাবাহিকতা নিশ্চিত করার জন্য) একটি কাস্টম @IBDesignableসাবক্লাস ব্যবহার করা হয়েছে UILabelএবং আমি নীচের মতো কিছু প্রয়োগ করেছি:

override func intrinsicContentSize() -> CGSize {
    if hidden {
        return CGSizeZero
    } else {
        return super.intrinsicContentSize()
    }
}

এটি লেবেল সাবক্লাসটিকে অটো লেআউটে অংশ নিতে দেয়, তবে লুকানো অবস্থায় কোনও স্থান নেয় না।


13

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

এখানে একটি সাধারণ উদাহরণ:

আইবি স্ক্রিনশট

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

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

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


যারা নতুন তাদের জন্য NSLayoutConstraintআমি বিশ্বাস করি যে আপনি আপডেট করতে চান constantসম্পত্তি আপনার এর authorLabelHeight
কাইল

8

আইবিউউটলেট হিসাবে ইউভিউ এবং লেবেলের মধ্যে সীমাবদ্ধতার সংযোগ স্থাপন করুন এবং গোপনে = ইয়েস সেট করলে অগ্রাধিকার সদস্যকে কম মূল্যে সেট করুন


3
এটি একবার প্রতিষ্ঠিত হয়ে গেলে আপনি কোনও এনএসআলআউটকন্ট্রেন্টের অগ্রাধিকারটি সামঞ্জস্য করতে পারবেন না; আপনাকে আলাদা অগ্রাধিকার সহ একটি নতুন প্রতিবন্ধকতা সরিয়ে ফেলতে হবে।
টিম

7
আমি এই পদ্ধতিতে কাজ করতে পেরেছি। আমার একটি কেস রয়েছে যা লেবেল এবং একটি বোতাম ব্যবহার করে, যেখানে আমার বোতামটি আড়াল করতে হবে এবং লেবেলটি প্রসারিত করতে হবে। আমার দুটি সীমাবদ্ধতা রয়েছে, প্রথমদিকে অগ্রাধিকার 751 এবং অন্যটি 750 দিয়ে। তারপর আমি বোতামটি আড়াল করার পরে আমি অগ্রাধিকারগুলি সরিয়ে ফেলি এবং লেবেলের দৈর্ঘ্য বৃদ্ধি পায়। এটি লক্ষ করা উচিত যে আপনি উচ্চতর অগ্রাধিকার 1000 করার চেষ্টা করলে আপনি একটি ত্রুটি পান "ইনস্টলড সীমাবদ্ধতার (বা তদ্বিপরীত) না করা প্রয়োজন থেকে অগ্রাধিকারকে রূপান্তরিত করা সমর্থনযোগ্য নয়"। সুতরাং না এবং আপনি ভাল আছেন বলে মনে হচ্ছে। এক্সকোড 5.1 / ভিউডিডলড।
জন বুশনেল

8

আমি যা করতে পেরেছি তা হল 2 xibs তৈরি করা। বাম দৃশ্য সহ একটি এবং এটি ছাড়াই একটি। আমি নিয়ামক উভয়কেই নিবন্ধভুক্ত করেছি এবং তারপরে স্থিত করেছিলাম সেলফোরোআউটইন্টেক্সপথের সময় কোনটি ব্যবহার করব।

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

সাধারণত, এটি সম্ভবত একটি ভাল সমাধান যেহেতু তারা প্রযুক্তিগতভাবে পৃথক বিন্যাস এবং তাই বিভিন্ন xibs হওয়া উচিত।

[self.table registerNib:[UINib nibWithNibName:@"TrackCell" bundle:nil] forCellReuseIdentifier:@"TrackCell"];
[self.table registerNib:[UINib nibWithNibName:@"TrackCellNoImage" bundle:nil] forCellReuseIdentifier:@"TrackCellNoImage"];

TrackCell *cell = [tableView dequeueReusableCellWithIdentifier:(appDelegate.showImages ? @"TrackCell" : @"TrackCellNoImage") forIndexPath:indexPath];

7

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

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

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

cell.authorLabelHeight.constant = 0;

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


6

দুটি ইউআইএসট্যাক ভিউ অনুভূমিক এবং উল্লম্ব ব্যবহার করুন, যখন স্ট্যাকের কিছু সংক্ষিপ্ত চিত্রটি লুকানো থাকে অন্য স্ট্যাকের পূর্বরূপগুলি সরানো হবে, বিতরণ ব্যবহার করুন -> দুটি ইউআইএলবেল সহ উল্লম্ব স্ট্যাকের জন্য অনুপাতটি পূরণ করুন এবং প্রথম ইউআইভিউয়ের জন্য প্রস্থ এবং উচ্চতা সংস্থাগুলির প্রয়োজন হবেএখানে চিত্র বর্ণনা লিখুন


2

এটি চেষ্টা করে দেখুন, আমি কোডের নীচে প্রয়োগ করেছি,

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

1.ভিউকন্ট্রোল.আর ফাইল

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIView *viewOne;
@property (strong, nonatomic) IBOutlet UIView *viewTwo;
@property (strong, nonatomic) IBOutlet UIView *viewThree;
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *viewOneWidth;
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *viewTwoWidth;
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *viewThreeWidth;
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *viewBottomWidth;
@end

2.ViewController.m

 #import "ViewController.h"
 @interface ViewController ()
{
  CGFloat viewOneWidthConstant;
  CGFloat viewTwoWidthConstant;
  CGFloat viewThreeWidthConstant;
  CGFloat viewBottomWidthConstant;
}
@end

@implementation ViewController
@synthesize viewOne, viewTwo, viewThree;

- (void)viewDidLoad {
  [super viewDidLoad];
 // Do any additional setup after loading the view, typically from a 
  nib.

  /*
   0  0   0
   0  0   1
   0  1   0
   0  1   1
   1  0   0
   1  0   1
   1  1   0
   1  1   1
   */

  //    [viewOne setHidden:NO];
  //    [viewTwo setHidden:NO];
  //    [viewThree setHidden:NO];

  //    [viewOne setHidden:NO];
  //    [viewTwo setHidden:NO];
  //    [viewThree setHidden:YES];

  //    [viewOne setHidden:NO];
  //    [viewTwo setHidden:YES];
  //    [viewThree setHidden:NO];

  //    [viewOne setHidden:NO];
  //    [viewTwo setHidden:YES];
  //    [viewThree setHidden:YES];


  //    [viewOne setHidden:YES];
  //    [viewTwo setHidden:NO];
  //    [viewThree setHidden:NO];

  //    [viewOne setHidden:YES];
  //    [viewTwo setHidden:NO];
  //    [viewThree setHidden:YES];

 //    [viewOne setHidden:YES];
 //    [viewTwo setHidden:YES];
 //    [viewThree setHidden:NO];

//    [viewOne setHidden:YES];
//    [viewTwo setHidden:YES];
//    [viewThree setHidden:YES];

 [self hideShowBottomBar];
  }

- (void)hideShowBottomBar
{
  BOOL isOne = !viewOne.isHidden;
  BOOL isTwo = !viewTwo.isHidden;
  BOOL isThree = !viewThree.isHidden;

  viewOneWidthConstant = _viewOneWidth.constant;
  viewTwoWidthConstant = _viewTwoWidth.constant;
  viewThreeWidthConstant = _viewThreeWidth.constant;
  viewBottomWidthConstant = _viewBottomWidth.constant;

   if (isOne && isTwo && isThree) {
    // 0    0   0
    _viewOneWidth.constant = viewBottomWidthConstant / 3;
    _viewTwoWidth.constant = viewBottomWidthConstant / 3;
    _viewThreeWidth.constant = viewBottomWidthConstant / 3;
    }
    else if (isOne && isTwo && !isThree) {
     // 0    0   1
    _viewOneWidth.constant = viewBottomWidthConstant / 2;
    _viewTwoWidth.constant = viewBottomWidthConstant / 2;
    _viewThreeWidth.constant = 0;
    }
   else if (isOne && !isTwo && isThree) {
    // 0    1   0
    _viewOneWidth.constant = viewBottomWidthConstant / 2;
    _viewTwoWidth.constant = 0;
    _viewThreeWidth.constant = viewBottomWidthConstant / 2;
    }
    else if (isOne && !isTwo && !isThree) {
    // 0    1   1
    _viewOneWidth.constant = viewBottomWidthConstant;
    _viewTwoWidth.constant = 0;
    _viewThreeWidth.constant = 0;
   }
   else if (!isOne && isTwo && isThree) {
    // 1    0   0
    _viewOneWidth.constant = 0;
    _viewTwoWidth.constant = viewBottomWidthConstant / 2;
    _viewThreeWidth.constant = viewBottomWidthConstant / 2;
   }
   else if (!isOne && isTwo && !isThree) {
    // 1    0   1
    _viewOneWidth.constant = 0;
    _viewTwoWidth.constant = viewBottomWidthConstant;
    _viewThreeWidth.constant = 0;
   }
   else if (!isOne && !isTwo && isThree) {
    // 1    1   0
    _viewOneWidth.constant = 0;
    _viewTwoWidth.constant = 0;
    _viewThreeWidth.constant = viewBottomWidthConstant;
   }
   else if (isOne && isTwo && isThree) {
    // 1    1   1
    _viewOneWidth.constant = 0;
    _viewTwoWidth.constant = 0;
    _viewThreeWidth.constant = 0;
   }
  }

 - (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
 // Dispose of any resources that can be recreated.
 }
 @end

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

আশা করি এই যুক্তিটি কিছুটিকে সাহায্য করবে।


1

আমার ক্ষেত্রে আমি লাগাতার সেট উচ্চতা বাধ্যতা থেকে 0.0fএবং সেট hiddenকরার সম্পত্তি YES

ভিউটি দেখানোর জন্য (সংক্ষিপ্তসারগুলি দিয়ে) আবার আমি তার বিপরীতটি করেছি: আমি উচ্চতাটিকে একটি অ-শূন্য মানের স্থির করে সেটাকে hiddenসম্পত্তি হিসাবে সেট করেছি NO


1

আমি অনুভূমিক স্ট্যাকভিউ ব্যবহার করব। সাবউভিউ লুকানো থাকলে এটি ফ্রেমটি সরিয়ে ফেলতে পারে।

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

  1. দৃশ্যটি দৃশ্যমান / ইনস্টল থাকা অবস্থায় এটি হয়।

দৃশ্য দৃশ্যমান

  1. দৃশ্যটি লুকানো / ইনস্টল না থাকা অবস্থায় এটি হয়।

ভিউ লুকানো / মুছে ফেলা হয়


1

অগ্রাধিকারের সীমাবদ্ধতাটি ব্যবহার করে এটি আমার আর একটি সমাধান। ধারণাটি প্রস্থকে 0 তে সেট করা হয়েছে।

  1. ধারক দেখুন (কমলা) এবং প্রস্থ সেট করুন। এখানে চিত্র বর্ণনা লিখুন

  2. কন্টেন্ট ভিউ (লাল) তৈরি করুন এবং সুপারভিউতে (কমলা) 10 টি পিছনের স্থান সেট করুন। স্থানের সীমাবদ্ধতাগুলি লক্ষ্য করুন, সেখানে বিভিন্ন অগ্রাধিকার সহ 2 টি অনুসরণীয় বাধা রয়েছে। নিম্ন (= 10) এবং উচ্চ (<= 10)। অস্পষ্টতা এড়ানোর জন্য এটি গুরুত্বপূর্ণ। এখানে চিত্র বর্ণনা লিখুন

  3. ভিউটি লুকানোর জন্য কমলা ভিউয়ের প্রস্থকে 0 এ সেট করুন। এখানে চিত্র বর্ণনা লিখুন


0

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

রিঅ্যাকটিভ কোকোয়া ব্যবহার করে এখানে একটি স্নিপেট রয়েছে:

RACSignal* isViewOneHiddenSignal = RACObserve(self.viewModel, isViewOneHidden);
RACSignal* isViewTwoHiddenSignal = RACObserve(self.viewModel, isViewTwoHidden);
RACSignal* isViewThreeHiddenSignal = RACObserve(self.viewModel, isViewThreeHidden);
RAC(self.viewOne, hidden) = isViewOneHiddenSignal;
RAC(self.viewTwo, hidden) = isViewTwoHiddenSignal;
RAC(self.viewThree, hidden) = isViewThreeHiddenSignal;

RAC(self.viewFourBottomConstraint, priority) = [[[[RACSignal
    combineLatest:@[isViewOneHiddenSignal,
                    isViewTwoHiddenSignal,
                    isViewThreeHiddenSignal]]
    and]
    distinctUntilChanged]
    map:^id(NSNumber* allAreHidden) {
        return [allAreHidden boolValue] ? @(780) : @(UILayoutPriorityDefaultHigh);
    }];

RACSignal* updateFramesSignal = [RACObserve(self.viewFourBottomConstraint, priority) distinctUntilChanged];
[updateFramesSignal
    subscribeNext:^(id x) {
        @strongify(self);
        [self.view setNeedsUpdateConstraints];
        [UIView animateWithDuration:0.3 animations:^{
            [self.view layoutIfNeeded];
        }];
    }];

0

যদি এটি কাউকে সহায়তা করে তবে আমি ভিজ্যুয়াল ফর্ম্যাট সীমাবদ্ধতা ব্যবহারের জন্য একটি সহায়ক শ্রেণি তৈরি করেছি । আমি এটি আমার বর্তমান অ্যাপটিতে ব্যবহার করছি।

AutolayoutHelper

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

আমাকে টিমকে উপরের উত্তরটির জন্য , ইউআইএসক্রোলভিউ সম্পর্কে এই উত্তর এবং এই টিউটোরিয়ালটির জন্য ধন্যবাদ জানাতে হবে ।


0

আপনার সমাধান পেতে আমি কীভাবে আমার ইউভিউগুলিকে পুনরায় সারিবদ্ধ করব:

  1. একটি ইউআইআইমেজভিউ ড্রপ করুন এবং এটিকে বামে রাখুন।
  2. একটি ইউআইভিউ ড্রপ করুন এবং এটিকে ইউআইআইমেজভিউয়ের ডানদিকে রাখুন।
  3. সেই ইউআইভিউ-র ভিতরে দুটি ইউআইএলবেল টেনে আনুন যার শীর্ষস্থানীয় এবং পিছনের সীমাবদ্ধতাগুলি শূন্য।
  4. ইউআইআইভিউভিউয়ের পরিবর্তে সুপারভাইউতে 2 টি লেবেলযুক্ত ইউআইভিউয়ের শীর্ষস্থানীয় সীমাবদ্ধতা সেট করুন।
  5. যদি ইউআইআইমেজভিউ লুকানো থাকে তবে তত্ত্বাবধানে 10 পিক্সারে স্থির সীমানা নির্ধারণ করুন। ইএলএসই, শীর্ষস্থানীয় সীমাবদ্ধতা স্থির করে 10 পিক্স + ইউআইআইমেজভিউ.উইথ + 10 পিক্স।

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


0

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

এক্সটেনশন এবং "প্রসারিত" ইউভিউউ ব্যবহার করে আপনি আইওএস-তে একই কাজ করতে পারেন (এটি কেন আগে থেকেই ইউআইকিটিতে নেই তা নিশ্চিত নন) এখানে সুইফট 3 তে একটি বাস্তবায়ন রয়েছে:

    func isVisible(_ isVisible: Bool) {
        self.isHidden = !isVisible
        self.translatesAutoresizingMaskIntoConstraints = isVisible
        if isVisible { //if visible we remove the hight constraint 
            if let constraint = (self.constraints.filter{$0.firstAttribute == .height}.first){
                self.removeConstraint(constraint)
            }
        } else { //if not visible we add a constraint to force the view to have a hight set to 0
            let height = NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal , toItem: nil, attribute: .notAnAttribute, multiplier: 0, constant: 0)
            self.addConstraint(height)
        }
        self.layoutIfNeeded()
    }

0

এটি করার সঠিক উপায় হ'ল isActive = মিথ্যা দিয়ে সীমাবদ্ধতা অক্ষম করা। তবে খেয়াল করুন যে সীমাবদ্ধতা নিষ্ক্রিয় করা এটিকে সরিয়ে দেয় এবং ছেড়ে দেয়, সুতরাং আপনার জন্য তাদের কাছে শক্তিশালী আউটলেট থাকতে হবে।


0

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


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