Auto Layout: co to je, adaptivní rozvržení rozhraní iOS

Autor: IT Sectr Publikováno: 2026-02-21 Doba čtení: 9 min

Auto Layout — systém adaptivního umísťování prvků rozhraní od Apple, založený na matematických omezeních (constraints). Vyvinutý pro iOS 6 (2012), Auto Layout umožňuje vytvářet rozhraní, která se správně zobrazují na všech zařízeních — od iPhone SE (4.7″) po iPad Pro (12.9″) a Dynamic Island. Podle Apple WWDC Session 202 (2024) používá více než 90% aplikací v App Store Auto Layout nebo jeho deklarativní alternativu — SwiftUI layout system. Constraints popisují závislosti mezi UI prvky prostřednictvím lineárních rovnic: view1.leading = view2.trailing + 8.

Hlavní

  • Auto Layout — adaptivní rozvrhovací systém Apple pomocí matematických omezení (constraints) pro všechny velikosti obrazovek.
  • Constraints — lineární rovnice tvaru view1.attribute = multiplier × view2.attribute + constant, řešené Cassowary algoritmem.
  • UIStackView — kontejner automaticky spravující constraints pro vnořené view (horizontal/vertical, alignment, distribution).
  • NSLayoutConstraint — programové API pro vytváření omezení v kódu s aktivací pomocí isActive = true.
  • Safe Area a Layout Margins — vestavěné okraje Auto Layout vylučující překrytí s Dynamic Island, Notch a Home Indicator.

Co je Auto Layout?

Auto Layout — je adaptivní rozvrhovací systém Apple, který používá matematická omezení (constraints) pro umísťování UI prvků. Na rozdíl od rámcového rozvržení (frame-based layout), kde každý prvek má pevné souřadnice x, y, width, height, Auto Layout popisuje vztahy mezi prvky: «tlačítko je 8pt od pravého okraje rodiče» nebo «šířka textového pole je rovna polovině šířky obrazovky». Mechanismus je založen na algoritmu Cassowary, vyvinutém na University of Washington (Greg J. Badros, 1999) a implementovaném Apple v iOS 6. Cassowary řeší systém lineárních nerovností s prioritami — Required (1000), Default High (750), Default Low (250) — což umožňuje správu konfliktů omezení. Auto Layout podporuje tři typy velikostí: intrinsic (přirozená velikost prvku určená obsahem), explicit (explicitně zadané constraint) a compressible/stretchable (elastický režim přes Content Hugging Priority a Compression Resistance Priority).

Intrinsic Content Size a priority

Každý UI prvek v Auto Layout má Intrinsic Content Size — přirozenou velikost určenou svým obsahem. Pro UILabel závisí na textu a písmu, pro UIImageView — na rozměrech obrázku. Content Hugging Priority (odolnost proti natažení) a Compression Resistance Priority (odolnost proti stlačení) řídí chování prvku při změně dostupného prostoru. Standardní hodnoty: 251 pro hugging a 749 pro compression resistance. Pokud dva prvky soutěží o prostor, priorita určuje, který se natáhne jako první. Pochopení těchto priorit je klíčem k odstranění Ambiguous Layout (nejednoznačného rozvržení), které Xcode zvýrazňuje v debuggeru.

Anatomie Constraint

Constraint je popsán rovnicí: view1.attribute = multiplier × view2.attribute + constant. Atributy zahrnují leading, trailing, top, bottom, centerX, centerY, width, height, firstBaseline, lastBaseline. Multiplier se používá pro proporcionální vztahy (šířka view1 = 0.5 × šířka superview). Constant definuje pevný odstup (leading = superview.leading + 16). Nástroje Interface Builder umožňují vizuální nastavení constraints přetažením s Ctrl, ale složitá rozvržení vyžadují programové vytvoření přes NSLayoutConstraint nebo VFL (Visual Format Language), který Apple doporučuje nahradit NSLayoutConstraint od iOS 9.

Jak fungují Constraints v iOS

Systém constraints je řešen jako úloha lineárního programování: Cassowary algoritmus najde optimální umístění všech prvků, splňující všechna omezení s ohledem na jejich priority. Pokud si constraints vzájemně odporují, vzniká Unsatisfiable Layout — výjimka, kterou Xcode loguje s podrobným popisem konfliktu. Pokud constraints nestačí k určení polohy alespoň jednoho prvku, vzniká Ambiguous Layout — prvky se zobrazí v libovolné poloze. Apple doporučuje minimální sadu: pro každý prvek musí být určeny position (x, y) a size (width, height) — explicitně nebo přes intrinsic content size. Constraints mohou být first-class: vedoucí prvek (např. superview) a závislý (podřízený view) vytvářejí hierarchii.

Cassowary algoritmus a priority

Cassowary používá metodu Sequential Quadratic Programming pro řešení systémů lineárních nerovností. Každý constraint má prioritu od 1 do 1000. Required (1000) — povinné omezení; pokud jej nelze splnit, aplikace spadne s NSConstraintException. Default High (750) — doporučené; Default Low (250) — nejméně důležité. Při konfliktu Cassowary uvolňuje omezení s nižší prioritou. Například, pokud dva prvky vyžadují pevnou šířku a obrazovka je příliš úzká, uvolní se constraint s nižší prioritou. V Xcode Debug View Hierarchy (ladičský nástroj dostupný od Xcode 6) zvýrazňuje pouze problémy s Required constraints — ostatní jsou zpracovány bez chyby.

UIStackView: automatická správa Constraints

UIStackView — kontejner představený v iOS 9 (2015), který automaticky vytváří a spravuje constraints pro vnořené arrangedSubviews. UIStackView podporuje dvě osy: horizontal (horizontální rozvržení) a vertical (vertikální). Nastavení distribution určuje rozložení prostoru: fill (vyplnění proporcionálně k hugging priority), fillEqually (stejné velikosti), fillProportionally (proporcionálně k intrinsic content size), equalSpacing (stejné mezery), equalCentering (stejné vzdálenosti mezi středy). Alignment určuje zarovnání napříč osou: fill, leading, center, trailing (pro horizontal) nebo fill, top, center, bottom (pro vertical). UIStackView automaticky spravuje spacing, baseline alignment a přizpůsobení Dynamic Type.

swift
import UIKit

class StackViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let stack = UIStackView()
        stack.axis = NSLayoutConstraint.Axis.vertical
        stack.distribution = .fillEqually
        stack.spacing = 8
        stack.translatesAutoresizingMaskIntoConstraints = false
        
        let label = UILabel()
        label.text = "Průvodce Auto Layout"
        label.font = UIFont.preferredFont(forTextStyle: .headline)
        
        let button = UIButton(type: .system)
        button.setTitle("Použít", for: .normal)
        
        stack.addArrangedSubview(label)
        stack.addArrangedSubview(button)
        view.addSubview(stack)
        
        NSLayoutConstraint.activate([
            stack.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            stack.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            stack.leadingAnchor.constraint(greaterThanOrEqualTo: view.leadingAnchor, constant: 16),
            stack.trailingAnchor.constraint(lessThanOrEqualTo: view.trailingAnchor, constant: -16)
        ])
    }
}

Kód vytváří vertikální UIStackView se dvěma prvky (UILabel a UIButton), rovnoměrně rozloženými (fillEqually) s odstupem 8pt. Stack je vycentrován na obrazovce s okraji od okrajů alespoň 16pt. translatesAutoresizingMaskIntoConstraints = false je povinný při programovém vytváření constraints — bez něj Auto Layout nefunguje. V IT Sectr je UIStackView používán v 80% obrazovek iOS projektů pro stavbu adaptivních formulářů, seznamů nastavení a karet.

Vnořené Stack View

UIStackView mohou být vnořeny: horizontální stack uvnitř vertikálního — standardní vzor pro složitá rozvržení. Vnější stack spravuje řádky, vnitřní — sloupce uvnitř řádku. Kombinace axis, alignment a distribution na každé úrovni poskytuje prakticky neomezenou flexibilitu bez jediného ručního constraint. Apple doporučuje používat UIStackView jako hlavní nástroj rozvržení v UIKit, přičemž k ručním NSLayoutConstraint se uchyluje pouze pro případy, které stack nepokrývá: překrývající se view, přesné umístění na pixely, vlastní animace bounds.

NSLayoutConstraint: programové vytváření omezení

NSLayoutConstraint — programové API pro vytváření jednotlivých omezení v kódu. Každý constraint je vytvořen přes inicializátor s parametry: item, attribute, relatedBy, toItem, attribute, multiplier, constant. Od iOS 9 Apple představil Anchor API — čitelnější syntaxi přes vlastnosti view.leadingAnchor, view.trailingAnchor, view.topAnchor, view.bottomAnchor, view.centerXAnchor, view.centerYAnchor, view.widthAnchor, view.heightAnchor. Anchor API automaticky nastavuje relatedBy = .equal a používá First Item/Second Item z Anchor, čímž zkracuje kód o 40% ve srovnání s klasickým NSLayoutConstraint.

swift
import UIKit

class ConstraintViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let childView = UIView()
        childView.backgroundColor = .systemBlue
        childView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(childView)
        
        NSLayoutConstraint.activate([
            childView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 24),
            childView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
            childView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
            childView.heightAnchor.constraint(equalToConstant: 120),
            childView.bottomAnchor.constraint(lessThanOrEqualTo: view.bottomAnchor, constant: -24)
        ])
    }
}

Kód umísťuje childView s okraji od safeAreaLayoutGuide (top) a okrajů obrazovky (leading/trailing). lessThanOrEqualTo pro bottom zaručuje, že view nepřekročí spodní hranici. Anchor API vyhazuje výjimku ve fázi kompilace, pokud jsou anchory nekompatibilní (např. leadingAnchor je smíchán s rightAnchor), čímž předchází runtime chybám. Apple doporučuje Anchor API jako standard pro programový Auto Layout od iOS 9.

Safe Area a Layout Margins v Auto Layout

Safe Area — oblast obrazovky nepokrytá systémovými prvky: Dynamic Island, Notch, Status Bar, Home Indicator, zaoblené rohy. V iOS 11 Apple nahradil topLayoutGuide/bottomLayoutGuide safeAreaLayoutGuide, který se automaticky přizpůsobuje orientaci zařízení a přítomnosti výřezu obrazovky. Layout Margins — výchozí vnitřní okraje view (16pt na iOS, 20pt na iPadOS). Pro UILayoutGuide lze nastavit vlastní directionalLayoutMargins s ohledem na RIGHT-TO-LEFT lokalizaci. Auto Layout automaticky zohledňuje safe area při použití safeAreaLayoutGuide v anchorech.

Přizpůsobení Dynamic Island a Notch

Na zařízeních s Dynamic Island (iPhone 14 Pro a novější) a Notch (iPhone X–13) Safe Area vylučuje 44pt shora na výšku (59pt s Dynamic Island v aktivním stavu). Home Indicator přidává 34pt zdola. Pro správné přizpůsobení musí být všechny top-constraints vázány k safeAreaLayoutGuide.topAnchor, nikoli k view.topAnchor. Bottom-constraints — k safeAreaLayoutGuide.bottomAnchor nebo view.bottomAnchor s rezervou pro Home Indicator. V IT Sectr testujeme všechny obrazovky na simulátorech iPhone SE (2022), iPhone 14 Pro Max a iPad Pro 12.9″ — třech zařízeních pokrývajících všechny varianty safe area.

Typické chyby Auto Layout

Nejčastější chyby při práci s Auto Layout: zapomenuté translatesAutoresizingMaskIntoConstraints = false, konfliktní Required constraints (priorita 1000), Ambiguous Layout (nedostatek constraints pro určení polohy), nesprávný Content Hugging Priority pro UILabel s víceřádkovým textem a míchání leading/trailing s left/right anchors. Xcode 15+ zobrazuje problémy rozvržení v Runtime Issue Navigator a nabízí automatické opravy. Pro složitá rozvržení použijte Debug View Hierarchy: žluté štítky označují ambiguous layout, červené — unsatisfiable.

ChybaPříčinaŘešení
translatesAutoresizingMaskIntoConstraints = trueAuto Layout není aktivován pro viewNastavte false u všech programových view
Unsatisfiable LayoutKonflikt Required (1000) constraintsSnižte prioritu jednoho na Default High (750)
Ambiguous LayoutNedostatek constraints pro x/y/w/hPřidejte chybějící constraint nebo zkontrolujte intrinsic size
Ořezávání textu v UILabelContent Hugging Priority nižší než konkurentZvyšte hugging priority na 252+
Míchání LTR/RTL anchorůleadingAnchor s rightAnchorPoužívejte pouze leading/trailing pro podporu RTL

Často kladené otázky

Čím se Auto Layout liší od rámcového rozvržení?

Rámcové rozvržení nastavuje pevné souřadnice x, y, width, height pro každý prvek. Auto Layout používá matematická omezení (constraints) — vztahy mezi prvky: «label.leading = button.trailing + 8». Rámcové rozvržení se nepřizpůsobuje velikosti obrazovky; Auto Layout automaticky přepočítává pozice při otočení, Split View nebo změně Dynamic Type.

Kdy použít UIStackView místo NSLayoutConstraint?

UIStackView je optimální pro lineární rozvržení: řádky, sloupce, formuláře, seznamy parametrů. NSLayoutConstraint je nezbytný pro překrývající se view, přesné umístění na pixely, vlastní animaci bounds a případy, kdy je rozložení prostoru nerovnoměrné a není pokryto distribution UIStackView. V praxi 80% rozvržení řeší UIStackView, 20% — ruční constraints.

Co je Content Hugging Priority v Auto Layout?

Content Hugging Priority (odolnost proti natažení) — priorita určující, jak moc prvek odolává zvětšení své velikosti nad Intrinsic Content Size. Výchozí hodnota — 251. Pokud dva prvky soutěží o volný prostor, prvek s vyšším hugging priority zůstane své velikosti a druhý se natáhne. Compression Resistance Priority (výchozí 749) funguje analogicky pro stlačení.

Jak Auto Layout pracuje s Dynamic Type?

Auto Layout se automaticky přizpůsobuje Dynamic Type, pokud constraints používají intrinsic content size štítků. Při zvýšení velikosti písma se UILabel rozšiřuje, posouvá sousední prvky přes constraints. UIStackView s distribution = fillProportionally redistribuuje prostor proporcionálně k novým intrinsic size. Safe Area a Layout Margins také zohledňují nastavení přístupnosti.

Proč vzniká Unsatisfiable Layout?

Unsatisfiable Layout vzniká, když si dvě Required (priority = 1000) constraints vzájemně odporují: například view.leading = superview.leading + 16 a view.trailing = superview.leading + 200 při superview šířky 100pt. Cassowary algoritmus nemůže najít řešení a aplikace spadne s NSConstraintException. Řešení — snižte prioritu jednoho z konfliktních constraints na Default High (750).

Shrnutí

  • Auto Layout — adaptivní rozvrhovací systém Apple založený na Cassowary algoritmu, řešící systém lineárních omezení s prioritami.
  • Constraints — rovnice tvaru view1.attribute = multiplier × view2.attribute + constant s prioritami 1 až 1000 (Required).
  • UIStackView — kontejner automaticky spravující constraints pro arrangedSubviews s podporou os, distribution a alignment.
  • NSLayoutConstraint s Anchor API — programový standard od iOS 9, zkracující kód o 40% oproti klasickému API.
  • Safe Area — oblast bez Dynamic Island, Notch, Home Indicator; povinná pro vázání top/bottom constraints.
  • Typické chyby — zapomenuté translatesAutoresizingMaskIntoConstraints, konflikt Required, Ambiguous Layout, míchání LTR/RTL anchorů.
  • Intrinsic Content Size a priority (hugging 251, compression 749) řídí chování prvků při změně dostupného prostoru.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také