Sobes.tech
Middle

რა არის გამართვა?

sobes.tech AI

პასუხი AI-სგან

iOS զարգացման մեջ դասավորումը վերաբերում է օգտագործողի ինտերֆեյսի տարրերի (UIViews) տեղադրմանը միմյանց կամ նրանց կոնտեյների (սուպերվյու) նկատմամբ։ Հիմնական մոտեցումները՝

  1. Ֆրեյմեր (Frames): Յուրաքանչյուր View-ի դիրքը և չափը (x, y, width, height) սահմանելը նրա սուբերվյուի կոորդինատային համակարգում։ Հարմար է պարզ, ֆիքսված մաքետների համար։

    let myView = UIView(frame: CGRect(x: 10, y: 20, width: 100, height: 50))
    // myView-ը տեղադրված է (10, 20) կետում վերևի ձախ անկյունից սուբերվյուի նկատմամբ։
    
  2. Auto Layout: Դեկլարատիվ համակարգ՝ տարրերի տեղադրման համար՝ հիմնված կանոնների (կոնստրեյնտների) վրա, որոնք սահմանում են հարաբերությունները Views-ների միջև։ Գնահատելի է հարմարեցվող մաքետների համար, որոնք փոխում են էկրանի տարբեր չափերի և ուղղությունների։

    • Կոնստրեյնտներ: Կանոններ, որոնք սահմանում են սահմանափակումներ View-ի հատկությունների վրա (օր., leading, trailing, top, bottom, centerY, centerX, width, height):
    • Կոնստրեյնտի առաջնահերթություն: Թվային արժեք, որը ցույց է տալիս կոնստրեյնտի կարևորությունը՝ հակամարտությունների լուծման ժամանակ (1-1000):

    Օրինակ՝ NSLayoutConstraint օգտագործելով՝

    let myView = UIView()
    myView.translatesAutoresizingMaskIntoConstraints = false // Անջատում ենք Auto Resizing Mask
    superview.addSubview(myView)
    
    NSLayoutConstraint.activate([
        myView.leadingAnchor.constraint(equalTo: superview.leadingAnchor, constant: 20),
        myView.trailingAnchor.constraint(equalTo: superview.trailingAnchor, constant: -20),
        myView.topAnchor.constraint(equalTo: superview.topAnchor, constant: 80),
        myView.heightAnchor.constraint(equalToConstant: 100)
    ])
    

    Օրինակ՝ Layout Anchors օգտագործելով՝

    let myView = UIView()
    myView.translatesAutoresizingMaskIntoConstraints = false
    superview.addSubview(myView)
    
    NSLayoutConstraint.activate([
        myView.centerXAnchor.constraint(equalTo: superview.centerXAnchor),
        myView.centerYAnchor.constraint(equalTo: superview.centerYAnchor),
        myView.widthAnchor.constraint(equalToConstant: 200),
        myView.heightAnchor.constraint(equalToConstant: 150)
    ])
    

    Օրինակ՝ VFL (Visual Format Language) օգտագործելով՝

    let myView = UIView()
    myView.translatesAutoresizingMaskIntoConstraints = false
    superview.addSubview(myView)
    
    let views: [String: UIView] = ["myView": myView]
    let metrics: [String: CGFloat] = ["margin": 20]
    
    NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|-margin-[myView]-margin-|",
                                                               options: [],
                                                               metrics: metrics,
                                                               views: views))
    NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "V:|-80-[myView(100)]",
                                                               options: [],
                                                               metrics: nil,
                                                               views: views))
    
  3. Autorezizačný mask: Պարզ համակարգ՝ նախքան Auto Layout-ը։ Позволяет задавать, как View должен растягиваться и сжиматься при изменении размера его супервью. Ավելի քիչ ճկուն, քան Auto Layout-ը, և հաճախ անջատվում է Auto Layout-ի օգտագործման ժամանակ (translatesAutoresizingMaskIntoConstraints = false).

  4. Stack Views (UIStackView UIKit-ում, VStack/HStack/ZStack SwiftUI-ում): Կոնտեյներներ, որոնք ավտոմատ կերպով կառավարում են իրենց զավակ View-ների (arrangedSubviews) տեղադրումը և չափը՝ հիմնվելով սահմանված հատկությունների վրա (axis, alignment, distribution, spacing). Պարզեցնում են գծային և բազմաշերտ մաքետների ստեղծումը՝ ավտոմատ տեղադրմամբ։

    let stackView = UIStackView()
    stackView.axis = .vertical // Տարածման ուղղություն՝ ուղղահայաց
    stackView.alignment = .center // Թեքության ուղղությամբ հարմարեցում՝ կենտրոնում
    stackView.distribution = .equalSpacing // տարածության բաշխում
    stackView.spacing = 10 // միջակայք տարրերի միջև
    
    let label = UILabel()
    label.text = "Hello"
    let button = UIButton(type: .system)
    button.setTitle("Tap Me", for: .normal)
    
    stackView.addArrangedSubview(label)
    stackView.addArrangedSubview(button)
    
    superview.addSubview(stackView)
    // Ավելացնել կոնստրեյնտներ՝ stackView-ին՝ տեղադրելու համար այն սուպերվյուի մեջ
    

Ընտրությունը՝ ինչպես դասավորել, կախված է մաքետների բարդությունից և ադապտացվողության պահանջներից։ Մեծ մասամբ ժամանակակից հավելվածներում գերադասելի է Auto Layout-ը, հաճախ՝ Stack Views-ի հետ համատեղ։