إضافة القيود برمجياً في Swift: تحسين الأداء والأفضلية

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا برمجة القيود هي مهارة أساسية لمطور iOS؟

تخيل: أنت تعمل ليلاً على تطبيق، وStoryboard يتباطأ، والصراعات في Interface Builder لا تنتهي، والعميل يطلب إضافة شاشة متجاوبة مع جميع أجهزة iPhone. هل هذا مألوف؟ في هذه اللحظة بالذات، تبحث عن "كيفية إضافة القيود برمجياً باستخدام Swift". وهذا ليس عبثاً — إنه أحد أكثر الأسئلة شيوعاً على Stack Overflow بآلاف المشاهدات. لكن دعنا نتعمق أكثر: لن نترجم الإجابة فحسب، بل سنشرح كيفية القيام بذلك بشكل صحيح وسريع وبدون ألم.

القيود البرمجية تمنحك التحكم الكامل في التخطيط. لا فيلة وردية من Storyboard، ولا أرقام سحرية — فقط كود نقي ومتوقع. والأهم من ذلك — الأداء. عندما تكتب القيود يدوياً، تعرف بالضبط متى وأين يتم إنشاؤها. لا كائنات زائدة، ولا "مفاجآت" من Interface Builder. اليوم سنتعلم كيف نفعل ذلك كالمحترفين.

ما هي القيود البرمجية ولماذا تحتاجها؟

القيود (أو المحددات) هي قواعد تصف كيفية ترتيب العناصر بالنسبة لبعضها البعض والعنصر الأب. في Swift، هناك ثلاث طرق رئيسية لإضافتها برمجياً:

  • NSLayoutConstraint — الطريقة الكلاسيكية ولكنها مطولة
  • NSLayoutAnchor — واجهة برمجية حديثة وقابلة للقراءة وآمنة (موصى بها من Apple)
  • Visual Format Language (VFL) — تنسيق نصي لوصف مجموعات القيود

لماذا تحتاج هذا؟ تخيل أنك تبني واجهة ديناميكية: محادثة، خلاصة أخبار، أو نموذج بحقول متغيرة. Storyboard عاجز هنا — تحتاج إلى تغيير أحجام ومواقع العناصر أثناء تشغيل التطبيق. أو تعمل في فريق حيث يكره مراجعو الكود الصراعات في ملفات XIB. القيود البرمجية تحل كل هذه المشاكل.

NSLayoutAnchor: صديقك الجديد المفضل

لنبدأ بالطريقة الأكثر شيوعاً وصحة — NSLayoutAnchor. ظهرت هذه الواجهة في iOS 9 وأصبحت المعيار منذ ذلك الحين. إنها آمنة من حيث الأنواع، وقابلة للقراءة، ولا تسمح لك بخلط المحاور عن طريق الخطأ. شاهد:

import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let myView = UIView()
        myView.backgroundColor = .systemBlue
        myView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(myView)
        
        // إضافة القيود عبر anchors
        NSLayoutConstraint.activate([
            myView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            myView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            myView.widthAnchor.constraint(equalToConstant: 200),
            myView.heightAnchor.constraint(equalToConstant: 200)
        ])
    }
}

لاحظ السطر الرئيسي: myView.translatesAutoresizingMaskIntoConstraints = false. هذا شرط إلزامي. إذا أهملته، ستتعارض قيودك مع الأقنعة التلقائية، وسيتعطل التطبيق مع خطأ. تذكر مرة واحدة وإلى الأبد: في كل مرة تضيف فيها قيوداً برمجياً، قم بتعطيل autoresizing.

لماذا anchors أسرع وأكثر أماناً؟

في المشاريع القديمة، قد ترى NSLayoutConstraint مع معاملات. يبدو مخيفاً:

NSLayoutConstraint(item: myView, attribute: .centerX, relatedBy: .equal, toItem: view, attribute: .centerX, multiplier: 1.0, constant: 0).isActive = true

ألا توافق أن هذا يشبه التعويذة؟ خطأ في معامل واحد — وستحصل على خلل تبحث عنه لنصف يوم. Anchors تحل هذه المشكلة: فقط اكتب .centerXAnchor.constraint(equalTo: ...). المترجم يتحقق من الأنواع، وXcode يقترح الخيارات — روعة!

المدونات

توصيات الكتب