[Ios] أين يجب أن أضع قيود أوتولايوت عند إنشاء المشاهدات برمجيا


Answers

أوصي بإنشاء -updateConstraints ووضعها في -updateConstraints من -updateConstraints (أو -updateViewConstraints ، ل -updateViewConstraints ).

-[UIView updateConstraints] : (مستندات التفاح)

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

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

فمثلا:

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

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

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

Question

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

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




يمكنك تعيينها في فيو ويلايوت المشاهدات: أيضا:

 override func viewWillLayoutSubviews() {

    if(!wasViewLoaded){
        wasViewLoaded = true

        //update constraint

        //also maybe add a subview            
    }
}