[ios] أين يجب أن أضع قيود autolayout عند إنشاء طرق العرض برمجيًا



Answers

-updateConstraints بإنشاء BOOL -updateConstraints في -updateConstraints UIView (أو -updateViewConstraints ، من أجل -updateViewConstraints ).

-[UIView updateConstraints] : ( -[UIView updateConstraints] docs)

يجب على العروض المخصصة التي تحدد القيود نفسها أن تفعل ذلك عن طريق تجاوز هذه الطريقة.

قد يتم استدعاء كل من -updateConstraints و -updateViewConstraints عدة مرات خلال عمر العرض. (يؤدي استدعاء setNeedsUpdateConstraints على المشاهدة إلى حدوث هذا ، على سبيل المثال.) وكنتيجة لذلك ، يجب التأكد من منع إنشاء قيود مكررة وتفعيلها - إما باستخدام BOOL لأداء إعداد قيد معين مرة واحدة فقط ، أو عن طريق إجراء تأكد من إلغاء / إزالة القيود الموجودة قبل إنشاء وتفعيل قيود جديدة.

فمثلا:

  - (void)updateConstraints {  // for view controllers, use -updateViewConstraints

         if (!_hasLoadedConstraints) {
              _hasLoadedConstraints = YES;
             // create your constraints
         }
         [super updateConstraints];
    }

هتافfresidue في التعليقات لافتًا إلى أن مستندات Apple تنصح بالاتصال بالمرسوم كخطوة أخيرة. إذا قمت بالاتصال بـ super قبل إجراء تغييرات على بعض القيود ، فقد تصل إلى استثناء وقت التشغيل (تعطل).

Question

أرى أمثلة مختلفة حيث يتم تعيين القيود. بعض وضعها في viewDidLoad / loadView (بعد إضافة loadView ). تعيين الآخرين في الأسلوب updateViewConstraints ، والذي يحصل على استدعاء بواسطة viewDidAppear .

عندما أحاول تعيين قيود في updateViewContraints قيود ، يمكن أن يكون هناك updateViewContraints في التخطيط ، على سبيل المثال تأخير بسيط قبل ظهور العرض. أيضا ، إذا كنت تستخدم هذه الطريقة ، هل ينبغي أن [self.view [removeConstraints:self.view.constraints] القيود القائمة أولاً أي [self.view [removeConstraints:self.view.constraints] ؟




افعلها في طريقة تخطيط طريقة العرض الفرعي

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
}



لدي هذا الحل لتغيير القيود قبل تحميل أولئك الذين هم في لوحة العمل. يزيل هذا الحل أي تأخير بعد تحميل العرض.

-(void)updateViewConstraints{

    dispatch_async(dispatch_get_main_queue(), ^{

            //Modify here your Constraint -> Activate the new constraint and deactivate the old one

            self.yourContraintA.active = true;
            self.yourContraintB.active= false;
            //ecc..
           });

    [super updateViewConstraints]; // This must be the last thing that you do here -> if! ->Crash!
}



Links