Sobes.tech
Middle

Co je to zarovnání?

sobes.tech AI

Odpověď od AI

Zarovnání v iOS vývoji odkazuje na mechanismy umístění prvků uživatelského rozhraní (UIViews) vůči sobě nebo jejich kontejneru (superview). Hlavní přístupy:

  1. Frames: Nastavení pozice a velikosti (x, y, width, height) každého View v souřadnicovém systému superview. Vhodné pro jednoduché, pevné rozvržení.

    let myView = UIView(frame: CGRect(x: 10, y: 20, width: 100, height: 50))
    // myView bude umístěn v bodě (10, 20) vzhledem k levému hornímu rohu superview.
    
  2. Auto Layout: Deklarativní systém pro umístění prvků na základě pravidel (constraints), která určují vztahy mezi Views. Flexibilní přístup pro responzivní rozvržení, které se přizpůsobují různým velikostem obrazovky a orientacím.

    • Constraints: Pravidla, která nastavují omezení vlastností View (například leading, trailing, top, bottom, centerY, centerX, width, height).
    • Priorita constraint: Číselná hodnota, která ukazuje důležitost constraint při řešení konfliktů (1-1000).

    Příklad constraints s NSLayoutConstraint:

    let myView = UIView()
    myView.translatesAutoresizingMaskIntoConstraints = false
    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)
    ])
    

    Constraints pomocí 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)
    ])
    

    Constraints pomocí 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. Autoresizing Mask: Jednoduchý systém zarovnání, který předcházel Auto Layout. Umožňuje určit, jak se View bude roztahovat a stlačovat při změně velikosti superview. Méně flexibilní než Auto Layout, často se vypíná při použití Auto Layout (translatesAutoresizingMaskIntoConstraints = false).

  4. Stack Views (UIStackView v UIKit, VStack/HStack/ZStack v SwiftUI): Kontejnery, které automaticky řídí umístění a velikost svých podřízených View (arrangedSubviews) na základě nastavených vlastností (axis, alignment, distribution, spacing). Zjednodušují tvorbu lineárních a vrstvených rozvržení s automatickým zarovnáním.

    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)
    // Přidání constraints pro umístění stackView do superview
    

Volba metody zarovnání závisí na složitosti rozvržení a požadavcích na adaptabilitu. Ve většině moderních aplikací je preferováno Auto Layout, často ve spojení se Stack Views.