কোনও ইউআইভিউকে প্রভাবিত করে সমস্ত প্রতিবন্ধকতা সরান


90

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

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

প্রতিটি একক প্রতিবন্ধকতার জন্য আইবিআউটলেট তৈরি না করে এবং কোন দৃশ্যের মালিকানা কোন সীমাবদ্ধতার কথা মনে না রেখে আমি কীভাবে এটি করতে পারি?

বিস্তারিতভাবে বলতে গেলে নিখুঁত পদ্ধতির প্রতিবন্ধকতার জন্য প্রতিটি আইবিআউটলেটগুলি তৈরি করা হবে এবং তারপরে কোডিং কোড জড়িত যেমন:

[viewA removeConstraint:self.myViewsLeftConstraint];
[viewB removeConstraint:self.myViewsTopConstraint];
[viewB removeConstraint:self.myViewsBottomConstraint];
[self.view removeConstraint:self.myViewsRightConstraint];

এই কোডটির সাথে সমস্যাটি হ'ল এমনকি সহজতম ক্ষেত্রেও আমার 2 আইবিউটলেট তৈরি করা দরকার। জটিল লেআউটগুলির জন্য, এটি সহজেই 4 বা 8 প্রয়োজনীয় আইবিউটলেটগুলি পৌঁছে দিতে পারে। তদুপরি, আমার নিশ্চিত হওয়া দরকার যে সীমাবদ্ধতা অপসারণের জন্য আমার কলটি সঠিক দৃষ্টিভঙ্গিতে ডাকা হচ্ছে। উদাহরণস্বরূপ, কল্পনা করুন যে myViewsLeftConstraintএটির মালিকানাধীন viewA। যদি আমি দুর্ঘটনাক্রমে কল করতে পারি তবে [self.view removeConstraint:self.myViewsLeftConstraint]কিছুই হবে না।

দ্রষ্টব্য: পদ্ধতিটি সীমাবদ্ধ করেআফেক্টিংলআউটআউটএক্সিস প্রতিশ্রুতিবদ্ধ দেখায়, তবে এটি কেবল ডিবাগিংয়ের উদ্দেশ্যে তৈরি।


আপডেট করুন: উত্তর আমি সঙ্গে চুক্তি গ্রহণ করছি অনেকেই self.constraints, self.superview.constraints, অথবা কিছু তাদের বৈকল্পিক। এই সমাধানগুলি কার্যকর হবে না কারণ এই পদ্ধতিগুলি কেবলমাত্র দৃষ্টিভঙ্গিকে প্রভাবিত করে না, কেবলমাত্র দৃশ্যের মালিকানার প্রতিবন্ধকতাগুলি ফিরিয়ে দেয়।

এই সমাধানগুলির সাহায্যে সমস্যাটি স্পষ্ট করতে এই মতামতটিকে শ্রেণিবিন্যাস বিবেচনা করুন:

  • দাদা
    • পিতা
      • আমাকে
        • পুত্র
        • কন্যা
      • ভাই
    • চাচা

এখন কল্পনা করুন আমরা নিম্নলিখিত সীমাবদ্ধতাগুলি তৈরি করি এবং সর্বদা তাদের নিকটতম সাধারণ পূর্বপুরুষের সাথে সংযুক্ত করি:

  • C0: আমি: পুত্র হিসাবে একই শীর্ষ (আমার মালিকানাধীন)
  • সি 1: আমি: প্রস্থ = 100 (আমার মালিকানাধীন)
  • সি 2: মি: ভাইয়ের সমান উচ্চতা (পিতার মালিকানাধীন)
  • সি 3: মি: আঙ্কেলের মতো একই শীর্ষে (দাদুর মালিকানাধীন)
  • সি 4: মি: দাদুর সমান বাম (দাদার মালিকানাধীন)
  • সি 5: ভাই: ফাদার হিসাবে একই বাম (পিতার মালিকানাধীন)
  • সি:: চাচা: দাদুর সমান বাম (দাদার মালিকানাধীন)
  • সি 7: পুত্র: কন্যার মতোই বাম (আমার মালিকানাধীন)

এখন কল্পনা করুন আমরা প্রভাবিত সমস্ত প্রতিবন্ধকতা মুছে ফেলতে চাই Me। যে কোনও সঠিক সমাধান অপসারণ করা উচিত [C0,C1,C2,C3,C4]এবং অন্য কিছু নয়।

যদি আমি ব্যবহার করি self.constraints(যেখানে স্বয়ং আমার) তবে আমি তা পাব [C0,C1,C7], কারণ সেগুলি কেবল আমার মালিকানাধীন প্রতিবন্ধকতা। স্পষ্টতই এটি নিখোঁজ হওয়ায় এটি অপসারণ করার পক্ষে যথেষ্ট হবে না [C2,C3,C4]। তদুপরি, এটি C7অযথা অপসারণ করা হচ্ছে ।

যদি আমি ব্যবহার করি self.superview.constraints(যেখানে স্বয়ং আমিই থাকি) তবে আমি [C2,C5]পেতাম, যেহেতু সেগুলি পিতার মালিকানার সীমাবদ্ধতা। স্পষ্টতই আমরা এই C5সমস্তগুলি অপসারণ করতে পারি না কারণ এটি সম্পূর্ণরূপে সম্পর্কিত নয় Me

আমি যদি ব্যবহার করি তবে আমি grandfather.constraintsপেয়ে যাব [C3,C4,C6]। আবার, আমরা এগুলি সবগুলি অপসারণ করতে পারি না কারণ C6অটুট থাকা উচিত।

নিষ্ঠুর বলের দৃষ্টিভঙ্গি হ'ল ভিউর পূর্বসূরীদের প্রত্যেককে (নিজেও অন্তর্ভুক্ত) লুপ করা, এবং দেখা নিজেই হয় firstItemবা না secondItemহয় তা দেখতে; যদি তা হয় তবে সেই সীমাবদ্ধতা সরিয়ে দিন। এটি সঠিক সমাধান, প্রত্যাবর্তন [C0,C1,C2,C3,C4]এবং কেবলমাত্র সেই সীমাবদ্ধতার দিকে নিয়ে যাবে।

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


আপনি যে সমস্ত প্রতিবন্ধকতাগুলি সরাতে চান সেগুলি সম্পর্কে আপনি কোনও পরিচয়দানকারী রাখুন কীভাবে? এইভাবে তাদের জন্য কোনও আউটলেট রাখার দরকার নেই।
nsuinteger

উত্তর:


71

এই পদ্ধতিটি আমার পক্ষে কাজ করেছে:

@interface UIView (RemoveConstraints)

- (void)removeAllConstraints;

@end


@implementation UIView (RemoveConstraints)

- (void)removeAllConstraints
{
    UIView *superview = self.superview;
    while (superview != nil) {
        for (NSLayoutConstraint *c in superview.constraints) {
            if (c.firstItem == self || c.secondItem == self) {
                [superview removeConstraint:c];
            }
        }
        superview = superview.superview;
    }

    [self removeConstraints:self.constraints];
    self.translatesAutoresizingMaskIntoConstraints = YES;
}

@end

এটি সম্পাদন সম্পন্ন করার পরে আপনার দর্শনটি যেখানে ছিল সেখানেই রয়েছে কারণ এটি স্বতঃসীমাবদ্ধকরণ সীমাবদ্ধতা তৈরি করে। আমি যখন এটি না করি তখন দৃশ্যটি সাধারণত অদৃশ্য হয়ে যায়। অতিরিক্তভাবে, এটি কেবল তত্ত্বাবধানের থেকে প্রতিবন্ধকতাগুলি সরিয়ে দেয় না তবে পূর্বপুরুষের দর্শনগুলিতে এটির প্রভাবিত বাধা থাকতে পারে বলে সমস্ত পথ অতিক্রম করে tra


সুইফট 4 সংস্করণ

extension UIView {
    
    public func removeAllConstraints() {
        var _superview = self.superview
        
        while let superview = _superview {
            for constraint in superview.constraints {
                
                if let first = constraint.firstItem as? UIView, first == self {
                    superview.removeConstraint(constraint)
                }
                
                if let second = constraint.secondItem as? UIView, second == self {
                    superview.removeConstraint(constraint)
                }
            }
            
            _superview = superview.superview
        }
        
        self.removeConstraints(self.constraints)
        self.translatesAutoresizingMaskIntoConstraints = true
    }
}

4
এটি সরকারী উত্তর হওয়া উচিত।
জেসন ক্রকার

আপনার কাছে কেন স্ব। ট্রান্সলেটসআউটোরাইজিংমাস্কিন্টো কনস্ট্রাইনস = হ্যাঁ; ? সীমাবদ্ধতার সাথে সেট আপ করা দর্শনের জন্য আপনি আক্ষরিকভাবে এটি কখনই চান না?
লেন্সভেট

4
আমি সীমাবদ্ধতাগুলি সরিয়ে দিচ্ছি, তাই আমি অন্য বাধাগুলি স্থানে রাখার পরে অটোরেসাইজ সীমাবদ্ধতাগুলি ব্যবহার করতে চাই, আমার কোডটিতে সেই লাইনটি না থাকলে দৃশ্যটি অদৃশ্য হয়ে যাবে
মার্চিন্রাম

আমি প্রয়োজন লগ ইন করুন ডিবাগ উদ্দেশ্যে একটি দৃশ্য সমস্ত সীমাবদ্ধতা এবং আমি যে কাজ করতে সামান্য এই উত্তর পরিবর্তন করতে সক্ষম হন। +1
মরিচ

এটি ভুলভাবে মুছে ফেলবে C7। যাইহোক, এটা সহজ যদি আপনি সরাতে ফিক্স হওয়া উচিত [self removeConstraints:self.constraints];এবং পরিবর্তন UIView *superview = self.superview;করার UIView *superview = self;
সেনসফুল

50

আমি এখন পর্যন্ত একমাত্র সমাধানের সন্ধান পেয়েছি এটি হল এর তত্ত্বাবধান থেকে দৃশ্যটি সরিয়ে ফেলা:

[view removeFromSuperview]

দেখে মনে হচ্ছে এটি এর লেআউটকে প্রভাবিত করে সমস্ত প্রতিবন্ধকতাগুলি সরিয়ে দেয় এবং একটি সুপারভিউতে যুক্ত হতে প্রস্তুত এবং নতুন বাধা যুক্ত থাকে attached তবে এটি হায়ারার্কি থেকে ভুলভাবে যে কোনও সংক্ষিপ্তসারগুলি সরিয়ে ফেলবে এবং [C7]ভুলভাবে মুক্তি পাবে ।


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

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

একমাত্র সমাধান নয়, তবে খুব সহজ। আমার ব্যবহারের ক্ষেত্রে আমি তদারকির দৃশ্যটি সরিয়ে ফেলেছি এবং পরে এটি আবার যুক্ত করেছি।
মারিওন আর্নে

49

এটি করে আপনি একটি দৃশ্যে সমস্ত প্রতিবন্ধকতাগুলি সরিয়ে ফেলতে পারেন:

self.removeConstraints(self.constraints)

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

extension UIView {
    func clearConstraints() {
        for subview in self.subviews {
            subview.clearConstraints()
        }
        self.removeConstraints(self.constraints)
    }
}

22
এই সমাধানটির সমস্যাটি হ'ল এটি এই দৃশ্যের মালিকানাগুলি (যেমন এর প্রস্থ এবং উচ্চতা) কেবলমাত্র সীমাবদ্ধতাগুলি সরিয়ে দেয়। এটি নেতৃস্থানীয় এবং শীর্ষ সীমাবদ্ধতার মতো জিনিসগুলি সরিয়ে দেয় না।
সেনসফুল

4
আমি উপরে আপনার মন্তব্য যাচাই করা হয়নি। যাইহোক, আমি বিশ্বাস করি এটি উপরের মত একই বা আরও ভাল কাজ করবে, [এনএসএলআউটআউটস্ট্রন্ট অ্যাক্টিভেট কনসট্রেন্টস: সেলফ কন্ট্রেন্টস];
emdog4

4
এটি মূল সমস্যার মতো একই সমস্যায় ভুগবে। self.constraintsকেবলমাত্র selfমালিকানার সীমাবদ্ধতাগুলিই ফিরিয়ে দেয় , প্রভাবিত করে এমন সমস্ত প্রতিবন্ধকতা নয় self
সংবেদনশীল

4
আপনি এখন কি বলছেন তা আমি বুঝতে পারি। আমার উত্তরে আমি ইউআইটিএবলভিউসেল এর সামগ্রী ভিউ থেকে সীমাবদ্ধতাগুলি সরিয়ে দিচ্ছি। পদ্ধতির আপডেটকন্ট্রেন্টগুলি তারপরে সমস্ত সাবভিউয়ের জন্য সীমাবদ্ধতা যুক্ত করবে এবং লেআউটটিকে পুনরায় সেট করবে। উপরের আমার প্রথম মন্তব্যে , আমার নিজের.উভিউ.কন্ট্রেন্টস টাইপ করা উচিত। সেলফ.ভিউ এবং সেলফ কনটেন্টভিউ উভয়ই ভিউ হায়ারার্কির শীর্ষে রয়েছে। অনুবাদগুলি অটোরিজাইজিং মাস্কটোকোস্ট্রেনট্রেনস = ইয়েসকে স্ব.উইউ বা স্ব-কন্টেন্টভিউতে সেট করা একটি খারাপ ধারণা। ;-)। আমি অ্যাডসউবভিউয়ের কলগুলি পছন্দ করি না: আমার আপডেটসনস্ট্রাইন পদ্ধতিতে, স্তরক্রম থেকে ভিউ সরিয়ে ফেলা অপ্রয়োজনীয় ইমো বলে মনে হয়।
emdog4

আমি যা খুঁজছি তার জন্য কেন এর মতো সমাধান কাজ করবে না তা দেখানোর জন্য আমি কেবল প্রশ্নটি আপডেট করেছি। ধরে নিই যে আপনি কোনও ইউআইটিএবলভিউসিলের মধ্যে আছেন কন্টেন্টভিউয়ের সমতুল্য দাদা। সুতরাং আপনার সমাধানটি ভুলভাবে মুছে ফেলবে [C6], এবং ভুলভাবে মুছে ফেলবে না [C0,C1,C2]
সংবেদনশীল

20

অ্যাপল বিকাশকারী ডকুমেন্টেশন অনুযায়ী এটি কীভাবে অর্জন করা যায় তার দুটি উপায় রয়েছে

ঘ। NSLayoutConstraint.deactivateConstraints

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

// Declaration
class func deactivate(_ constraints: [NSLayoutConstraint])

// Usage
NSLayoutConstraint.deactivate(yourView.constraints)

2. UIView.removeConstraints(> আইওএস 8.0 এর জন্য অবনমিত)

আইওএস 8.0 বা তার পরে বিকাশ করার সময়, এনএসএলআউটআউটকন্ট্রেন্ট ক্লাসের নিষ্ক্রিয়কন্ট্রেনট্রেনট্রেনট্রেনট্রেশনগুলি: পদ্ধতিটি সরাসরি কল-এর পরিবর্তে কল করুন: পদ্ধতিটি ব্যবহার করুন। নিষ্ক্রিয়করণ নিয়ন্ত্রণগুলি: পদ্ধতিটি স্বয়ংক্রিয়ভাবে সঠিক দর্শনগুলি থেকে সীমাবদ্ধতাগুলি সরিয়ে দেয়।

// Declaration
func removeConstraints(_ constraints: [NSLayoutConstraint])`

// Usage
yourView.removeConstraints(yourView.constraints)

পরামর্শ

ব্যবহার StoryboardS বা XIBs করা আপনার দৃশ্যে উল্লিখিত সীমাবদ্ধতাগুলি কনফিগার করার ক্ষেত্রে এমন ব্যথা হতে পারে, আপনি মুছে ফেলতে চান এমন প্রত্যেকের জন্য আপনাকে আইবিআউটলেট তৈরি করতে হবে। তবুও, বেশিরভাগ সময় Interface Builderএটি সমাধানের চেয়ে বেশি সমস্যা তৈরি করে।

অতএব যখন খুব গতিশীল সামগ্রী এবং দৃশ্যের বিভিন্ন রাজ্য থাকাকালীন আমি পরামর্শ দেব:

  1. আপনার মতামত প্রোগ্রামক্রমে তৈরি করা
  2. তাদের লেআউট এবং ব্যবহার এনএসএলআউটআন্টর করুন
  3. প্রতিটি বাধা যুক্ত করুন যা পরে অ্যারেতে মুছে ফেলা হতে পারে
  4. নতুন রাষ্ট্র প্রয়োগের আগে প্রতিবার সেগুলি সাফ করুন

সাধারণ কোড

private var customConstraints = [NSLayoutConstraint]()

private func activate(constraints: [NSLayoutConstraint]) {
    customConstraints.append(contentsOf: constraints)
    customConstraints.forEach { $0.isActive = true }
}

private func clearConstraints() {
    customConstraints.forEach { $0.isActive = false }
    customConstraints.removeAll()
}

private func updateViewState() {
    clearConstraints()

    let constraints = [
        view.leadingAnchor.constraint(equalTo: parentView.leadingAnchor),
        view.trailingAnchor.constraint(equalTo: parentView.trailingAnchor),
        view.topAnchor.constraint(equalTo: parentView.topAnchor),
        view.bottomAnchor.constraint(equalTo: parentView.bottomAnchor)
    ]

    activate(constraints: constraints)

    view.layoutIfNeeded()
}

তথ্যসূত্র

  1. এনএসলয়আউটকন্ট্রেন্ট
  2. ইউআইভিউ

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

এই সমাধানটির সমস্যাটি হ'ল এটি এই দৃশ্যের মালিকানাগুলির (কেবলমাত্র এর প্রস্থ এবং উচ্চতা) সীমাবদ্ধতাগুলি সরিয়ে দেয়। এটি নেতৃস্থানীয় এবং শীর্ষ সীমাবদ্ধতার মতো জিনিসগুলি সরিয়ে দেয় না।
সেনসফুল

হ্যাঁ, সেনসফুল কী বলেছে। যদিও এই পদ্ধতিগুলি বিদ্যমান রয়েছে, তবে প্রশ্নটি আসলে জিজ্ঞাসা করা সমস্যাটি তারা নিজেরাই সমাধান করে না।
GSnyder

18

সুইফটে:

import UIKit

extension UIView {

    /**
     Removes all constrains for this view
     */
    func removeConstraints() {

        let constraints = self.superview?.constraints.filter{
            $0.firstItem as? UIView == self || $0.secondItem as? UIView == self
        } ?? []

        self.superview?.removeConstraints(constraints)
        self.removeConstraints(self.constraints)
    }
}

যদি আপনার দৃশ্যের 'তত্ত্বাবধানে' তদারকি না থাকে তবে এটি ক্রাশ হবে। অনুগ্রহ করে অংশটি একটি 'যদি সুপারভাইউ = সুপারভাইউ' তে আবদ্ধ করুন :)
বের্সেলোর

4
এটি সমস্ত বাধা সরিয়ে ফেলবে না। সীমাবদ্ধতাগুলি 2 টি প্রভাবিত দর্শনের নিকটতম অভিভাবককে নিয়ে যায়, তাই আপনি যদি এই দৃশ্যের তত্ত্বাবধানটি ভাগ না করে এমন প্রতিবন্ধকতা তৈরি করেন তবে সেই সীমাবদ্ধতা সরানো হবে না ...
ভ্রুইম

4
more if c.firstItem === selfas? UIView==
ালাইয়ের

সম্ভবত অপসারণ নিয়ন্ত্রণগুলি ব্যবহার করা উচিত নয়: আপেল ডক থেকে: // অপসারণ নিয়ন্ত্রণের পদ্ধতিটি ভবিষ্যতে প্রকাশে অবনতি হবে এবং এড়ানো উচিত। পরিবর্তে + [NSLayoutConstraint নিষ্ক্রিয় নিয়ন্ত্রণকারীগুলি:] ব্যবহার করুন।
5:58 এ 11

@ ইউনিস্ট উত্তরটি 3 বছর আগে ago সমালোচনার পরিবর্তে আপনার এটি সম্পাদনা করা উচিত।
আলেকজান্ডার ভোলকভ

5

বিশদ

  • এক্সকোড 10.2.1 (10E1001), সুইফট 5

সমাধান

import UIKit

extension UIView {

    func removeConstraints() { removeConstraints(constraints) }
    func deactivateAllConstraints() { NSLayoutConstraint.deactivate(getAllConstraints()) }
    func getAllSubviews() -> [UIView] { return UIView.getAllSubviews(view: self) }

    func getAllConstraints() -> [NSLayoutConstraint] {
        var subviewsConstraints = getAllSubviews().flatMap { $0.constraints }
        if let superview = self.superview {
            subviewsConstraints += superview.constraints.compactMap { (constraint) -> NSLayoutConstraint? in
                if let view = constraint.firstItem as? UIView, view == self { return constraint }
                return nil
            }
        }
        return subviewsConstraints + constraints
    }

    class func getAllSubviews(view: UIView) -> [UIView] {
        return view.subviews.flatMap { [$0] + getAllSubviews(view: $0) }
    }
}

ব্যবহার

print("constraints: \(view.getAllConstraints().count), subviews: \(view.getAllSubviews().count)")
view.deactivateAllConstraints()

4
এটা বেশ সুন্দর।
5:30 'এনিস্ট

2

একটি দ্রুত সমাধান:

extension UIView {
  func removeAllConstraints() {
    var view: UIView? = self
    while let currentView = view {
      currentView.removeConstraints(currentView.constraints.filter {
        return $0.firstItem as? UIView == self || $0.secondItem as? UIView == self
      })
      view = view?.superview
    }
  }
}

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


2

পূর্ববর্তী উত্তরের উপর ভিত্তি করে (দ্রুত 4)

আপনি যখন পুরো শ্রেণিবিন্যাস ক্রল করতে চান না তখন আপনি তাত্ক্ষণিক নিয়ন্ত্রণ ব্যবহার করতে পারেন।

extension UIView {
/**
 * Deactivates immediate constraints that target this view (self + superview)
 */
func deactivateImmediateConstraints(){
    NSLayoutConstraint.deactivate(self.immediateConstraints)
}
/**
 * Deactivates all constrains that target this view
 */
func deactiveAllConstraints(){
    NSLayoutConstraint.deactivate(self.allConstraints)
}
/**
 * Gets self.constraints + superview?.constraints for this particular view
 */
var immediateConstraints:[NSLayoutConstraint]{
    let constraints = self.superview?.constraints.filter{
        $0.firstItem as? UIView === self || $0.secondItem as? UIView === self
        } ?? []
    return self.constraints + constraints
}
/**
 * Crawls up superview hierarchy and gets all constraints that affect this view
 */
var allConstraints:[NSLayoutConstraint] {
    var view: UIView? = self
    var constraints:[NSLayoutConstraint] = []
    while let currentView = view {
        constraints += currentView.constraints.filter {
            return $0.firstItem as? UIView === self || $0.secondItem as? UIView === self
        }
        view = view?.superview
    }
    return constraints
}
}

2

আমি একটি ভিউ থেকে সমস্ত বাধা অপসারণ করতে নিম্নলিখিত পদ্ধতিটি ব্যবহার করি:

.h ফাইল:

+ (void)RemoveContraintsFromView:(UIView*)view 
    removeParentConstraints:(bool)parent 
    removeChildConstraints:(bool)child;

.m ফাইল:

+ (void)RemoveContraintsFromView:(UIView *)view 
    removeParentConstraints:(bool)parent 
    removeChildConstraints:(bool)child
{
    if (parent) {
        // Remove constraints between view and its parent.
        UIView *superview = view.superview;
        [view removeFromSuperview];
        [superview addSubview:view];
    }

    if (child) {
        // Remove constraints between view and its children.
        [view removeConstraints:[view constraints]];
    }
}

এটি হুডের পিছনে কীভাবে কাজ করে তা আরও ভাল করে বুঝতে আপনি আমার ব্লগে এই পোস্টটি পড়তে পারেন ।

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


2

সহজ এবং দক্ষ পদ্ধতির হ'ল সুপারভিউ থেকে ভিউ সরিয়ে ফেলা এবং পুনরায় সাবভিউ হিসাবে যুক্ত করা। এর ফলে সমস্ত দৃষ্টিভঙ্গি বাধা স্বয়ংক্রিয়ভাবে মুছে ফেলা হয় 😉


1

উদ্দেশ্যসিটি সহ

[self.superview.constraints enumerateObjectsUsingBlock:^(__kindof NSLayoutConstraint * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLayoutConstraint *constraint = (NSLayoutConstraint *)obj;
        if (constraint.firstItem == self || constraint.secondItem == self) {
            [self.superview removeConstraint:constraint];
        }
    }];
    [self removeConstraints:self.constraints];
}

0

আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

[viewA.superview.constraints enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSLayoutConstraint *constraint = (NSLayoutConstraint *)obj;
    if (constraint.firstItem == viewA || constraint.secondItem == viewA) {
        [viewA.superview removeConstraint:constraint];
    }
}];

[viewA removeConstraints:viewA.constraints];

মূলত, এটি ভিউএর সুপারভিউতে সমস্ত প্রতিবন্ধকতাগুলির উপরে অঙ্কিত হয় এবং ভিএএ সম্পর্কিত সমস্ত প্রতিবন্ধকতা সরিয়ে দেয়।

তারপরে, দ্বিতীয় অংশটি ভিএর সীমাবদ্ধতার অ্যারে ব্যবহার করে ভিউএ থেকে সীমাবদ্ধতাগুলি সরিয়ে দেয়।


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

এই সমাধানটি কেন কাজ করবে না তা দেখানোর জন্য আমি কেবল প্রশ্নটি আপডেট করেছি। এটি সঠিক হওয়ার সবচেয়ে কাছাকাছি, যেহেতু এটি উপরে বর্ণিত বল প্রয়োগ সমাধানের নিকটতম। তবে, এই সমাধানটি ভুলভাবে মুছে ফেলা [C7]হবে এবং ভুলভাবে মুছে ফেলা হবে না [C3,C4]
সংবেদনশীল

স্তরক্রম ক্রল করার জন্য আপনি পদ্ধতিটি ডিজাইন করতে পারেন could তবে এই সমাধানটি যথেষ্ট ভাল, যেহেতু আপনার তাত্ক্ষণিক তত্ত্বাবধানের উপরে বাধা যুক্ত করা উচিত। আইএমও
ইনিস্ট

0

(31 জুলাই, 2017 পর্যন্ত)

সুইফট 3

self.yourCustomView.removeFromSuperview()
self.yourCustomViewParentView.addSubview(self.yourCustomView)

উদ্দেশ্য গ

[self.yourCustomView removeFromSuperview];
[self.yourCustomViewParentView addSubview:self.yourCustomView];

ইউআইভিউতে বিদ্যমান সমস্ত প্রতিবন্ধকতা দ্রুত সরিয়ে ফেলার এটি সহজতম উপায়। কেবলমাত্র ইউআইভিউউকে এটির নতুন বাধা বা নতুন ফ্রেমের পরে যুক্ত করার বিষয়টি নিশ্চিত করুন =)


0

পুনরায় ব্যবহারযোগ্য ক্রম ব্যবহার করা ence

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

প্রথমে করণীয় হ'ল এটির একটি এক্সটেনশানকে সংজ্ঞায়িত করা Arraysহয় NSLayoutConstraintযা নির্দিষ্ট ভিউকে প্রভাবিত করে সমস্ত উপাদানকে ফেরত দেয়।

public extension Array where Element == NSLayoutConstraint {

    func affectingView(_ targetView:UIView) -> [NSLayoutConstraint] {

        return self.filter{

            if let firstView = $0.firstItem as? UIView,
                firstView == targetView {
                return true
            }

            if let secondView = $0.secondItem as? UIView,
                secondView == targetView {
                return true
            }

            return false
        }
    }
}

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

public struct AllConstraintsSequence : Sequence {

    public init(view:UIView){
        self.view = view
    }

    public let view:UIView

    public func makeIterator() -> Iterator {
        return Iterator(view:view)
    }

    public struct Iterator : IteratorProtocol {

        public typealias Element = (constraint:NSLayoutConstraint, owningView:UIView)

        init(view:UIView){
            targetView  = view
            currentView = view
            currentViewConstraintsAffectingTargetView = currentView.constraints.affectingView(targetView)
        }

        private let targetView  : UIView
        private var currentView : UIView
        private var currentViewConstraintsAffectingTargetView:[NSLayoutConstraint] = []
        private var nextConstraintIndex = 0

        mutating public func next() -> Element? {

            while(true){

                if nextConstraintIndex < currentViewConstraintsAffectingTargetView.count {
                    defer{nextConstraintIndex += 1}
                    return (currentViewConstraintsAffectingTargetView[nextConstraintIndex], currentView)
                }

                nextConstraintIndex = 0

                guard let superview = currentView.superview else { return nil }

                self.currentView = superview
                self.currentViewConstraintsAffectingTargetView = currentView.constraints.affectingView(targetView)
            }
        }
    }
}

পরিশেষে আমরা UIViewএকটি সাধারণ সম্পত্তিতে এটি প্রভাবিত করে এমন সমস্ত প্রতিবন্ধকতাগুলি প্রকাশ করার জন্য একটি এক্সটেনশান ঘোষণা করি যা আপনি প্রতিটি বাক্য বিন্যাসের মাধ্যমে অ্যাক্সেস করতে পারেন।

extension UIView {

    var constraintsAffectingView:AllConstraintsSequence {
        return AllConstraintsSequence(view:self)
    }
}

এখন আমরা একটি দৃশ্যের প্রভাবিত সমস্ত প্রতিবন্ধকতার পুনরাবৃত্তি করতে পারি এবং তাদের সাথে আমরা যা চাই তা করতে পারি ...

তাদের সনাক্তকারীদের তালিকাবদ্ধ করুন ...

for (constraint, _) in someView.constraintsAffectingView{
    print(constraint.identifier ?? "No identifier")
}

তাদের নিষ্ক্রিয় করুন ...

for (constraint, _) in someView.constraintsAffectingView{
    constraint.isActive = false
}

বা এগুলি পুরোপুরি সরান ...

for (constraint, owningView) in someView.constraintsAffectingView{
    owningView.removeConstraints([constraint])
}

উপভোগ করুন!


0

সুইফট

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

extension UIView {
    func removeAllConstraints() {
        if let _superview = self.superview {
            self.removeFromSuperview()
            _superview.addSubview(self)
        }
    }
}

-1

নির্দিষ্ট দর্শন থেকে সমস্ত বাধা নিষ্ক্রিয় করার উপায় এটি

 NSLayoutConstraint.deactivate(myView.constraints)

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