UIKit je framework pro vytváření grafických rozhraní v aplikacích pro iOS a macOS. Sada zahrnuje UIView, UIViewController, ovládací prvky a systém Auto Layout, umožňující vytvářet adaptivní a interaktivní obrazovky. Podle Apple Developer Documentation (2025) obsahuje UIKit více než 200 tříd pro práci s okny, pohledy, animacemi, gesty a textem — to je základ všech aplikací pro iPhone a iPad.
Hlavní body
UIKit — je framework od Apple, poskytující třídy pro vytváření a správu uživatelského rozhraní na iOS, iPadOS a macOS (přes Mac Catalyst). Pracuje nad Core Animation, Core Graphics a Quartz Core, abstrahuje nízkoúrovňové vykreslování do vysokoúrovňových objektů — tlačítek, štítků, obrázků a kontejnerů. UIKit se objevil spolu s iPhone OS 1 v roce 2007 a zůstává hlavním frameworkem pro vývoj iOS vedle SwiftUI.
Framework následuje imperativní přístup: vývojář vytváří instance tříd UIButton, UILabel, UIImageView, nastavuje jejich vlastnosti (barvu, písmo, polohu) a přidává je do hierarchie pohledů pomocí addSubview. Každá změna rozhraní se provádí explicitně — žádná magická aktualizace v pozadí. To odlišuje UIKit od deklarativních frameworků jako SwiftUI, kde popis stavu automaticky překresluje rozhraní.
Framework zahrnuje několik kategorií tříd. UIView — základní prvek, od kterého dědí všechny vizuální komponenty. UIWindow — kontejner nejvyšší úrovně, přes který se pohledy zobrazují na obrazovce. UIViewController — kontrolér spravující sadu pohledů a reagující na otáčení obrazovky, zobrazení klávesnice a systémová oznámení. UIApplication — vstupní bod zpracovávající události dotyku a stisknutí tlačítek.
Pro text se používají UILabel (statický text), UITextField (jednořádkový vstup), UITextView (víceřádkový vstup). Pro tlačítka — UIButton, včetně systémových, vlastních a s ikonografií SF Symbols. Pro navigaci — UINavigationController, UITabBarController a UISplitViewController. Celkem UIKit obsahuje více než 200 veřejných tříd.
Architektura UIKit je postavena na vrstvách: každá vrstva je zodpovědná za svůj aspekt zobrazení. Na nejnižší úrovni je Core Graphics — vykreslovací engine pro cesty, text a obrázky. Výše — Core Animation, spravující kompozici vrstev (CALayer) a animace mezi stavy. UIKit na nich staví objektově orientované API: UIView, UIViewController a UIResponder.
Každá aplikace má hierarchii pohledů (view hierarchy) — strom, jehož kořenem je UIWindow. Pod ním — kořenový UIViewController, jeho pohled a uvnitř — vnořené subview. Události dotyku se šíří podél řetězce responder chain: od nejvíce vnořeného pohledu k rodičům a dále k UIApplication. Pokud žádný objekt dotyk nezpracoval, je ignorován.
Každý UIView obsahuje vrstvu CALayer odpovědnou za vykreslování pixelů na obrazovce. Pohled spravuje dotyky a přístupnost, vrstva — grafiku: shadow, cornerRadius, border, transform. Rozdělení umožňuje přesunout těžkou grafiku na samostatné vlákno (render server), aniž by blokovalo main thread. Apple doporučuje pracovat přímo s CALayer, pokud je potřeba více než 200 pohledů na obrazovce — to snižuje zátěž CPU.
Řetězec responder začíná u objektu, který první přijímá událost dotyku. Pokud událost nezpracovává (metoda touchesBegan není přepsána), událost je předána dalšímu responderu v řetězci: next, superview, next responder, UIViewController, UIWindow, UIApplication, App Delegate. To umožňuje zachycovat globální gesta a události klávesnice na úrovni scény bez přidávání obsluhy do každého pohledu.
Každý UIViewController prochází přesně definovanou posloupností událostí. Životní cyklus zahrnuje fáze: inicializace, načtení pohledu, zobrazení na obrazovce, aktualizace rozvržení při otočení, skrytí, opuštění obrazovky a uvolnění paměti. Vývojář přepisuje odpovídající metody, aby provedl svůj kód v každé fázi.
class ProfileViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
loadUserProfile()
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
clearCache()
}
}
V viewDidLoad se konfiguruje rozhraní — vytvářejí se subview, nastavují omezení, přihlašují delegáti. V viewWillAppear se provádějí operace před zobrazením: načítání čerstvých dat ze sítě, aktualizace hodnot. viewDidDisappear — místo pro odhlášení z oznámení a čištění dočasných dat. Volání super je povinné ve všech přepsáních, jinak se řetězec událostí přeruší.
Ve starších verzích iOS existovala metoda viewDidUnload, volaná při nedostatku paměti. Od iOS 6 byla metoda odstraněna — nyní UIKit automaticky uvolňuje pohledy kontroléru, když nejsou viditelné. Vývojář musí pouze deklarovat všechny reference na pohledy jako weak, aby ARC mohl správně uvolnit paměť při obdržení varování od systému.
UIKit podporuje dva typy přechodů: segue (přes Storyboard) a programovou navigaci přes UINavigationController. Programový přechod vypadá takto: navigationController?.pushViewController(detailVC, animated: true). Přitom životní cyklus detailVC probíhá normálně — viewDidLoad se volá jednou, viewWillAppear — pokaždé při zobrazení.
Auto Layout — je systém umísťování prvků založený na matematických vztazích (omezeních). Místo pevně daných souřadnic X a Y vývojář popisuje pravidla: „tlačítko je napravo od štítku s odstupem 16pt” nebo „pohled se roztahuje na šířku obrazovky s okraji 20pt vlevo a vpravo”. Systém řeší výslednou soustavu rovnic za běhu, přizpůsobuje rozhraní libovolné velikosti obrazovky.
Omezení lze nastavit v Interface Builder (přes drag-and-drop) nebo programově ve Swiftu. Každé omezení je instancí třídy NSLayoutConstraint s parametry: firstItem, firstAttribute, relation, secondItem, secondAttribute, multiplier, constant. Omezení se aktivují pomocí isActive = true nebo hromadně pomocí NSLayoutConstraint.activate().
S iPhone X (2017) Apple zavedl Safe Area — oblast obrazovky bez notch, zaoblených rohů a indikátoru home bar. Omezení by měla být vázána na view.safeAreaLayoutGuide, nikoli na view. Layout Margins přidávají vnitřní okraje pohledu, ve výchozím nastavení 8pt nebo 16pt v závislosti na kontextu. Použití safeAreaLayoutGuide zaručuje správné zobrazení na všech generacích iPhone a iPad.
Auto Layout podporuje animaci prostřednictvím změny konstant omezení. Stačí aktualizovat constant omezení a zavolat UIView.animate s layoutIfNeeded uvnitř bloku animace. Systém plynule přepočítá polohu všech pohledů v hierarchii. Tato technika se používá pro rozbalovací bloky, adaptivní panel klávesnice a změnu orientace obrazovky.
UITableView a UICollectionView — dva výkonné nástroje UIKit pro zobrazení seznamů a mřížek. UITableView je vhodný pro vertikální seznamy s jedním sloupcem (chat, nastavení, zpravodajský kanál). UICollectionView — pro mřížky, horizontální seznamy, karusely a vlastní rozvržení (galerie, produkty, kalendář). Obě třídy používají vzor delegování k oddělení dat a vzhledu.
Zdrojem dat je protokol UITableViewDataSource s povinnými metodami numberOfRowsInSection a cellForRowAt. Delegát UITableViewDelegate zpracovává klepnutí na buňky, výšku řádků a události posouvání. Mechanismus reuse identifier znovu používá buňky, které opustily obrazovku, což je kritické pro výkon na velkých seznamech.
class ContactsViewController: UITableViewController {
private let contacts = ["Anna", "Boris", "Viktor"]
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self,
forCellReuseIdentifier: "cell")
}
override func tableView(_ tableView: UITableView,
numberOfRowsInSection section: Int) -> Int {
return contacts.count
}
override func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell",
for: indexPath)
var content = cell.defaultContentConfiguration()
content.text = contacts[indexPath.row]
cell.contentConfiguration = content
return cell
}
}
Příklad ukazuje minimální kontrolér pro zobrazení pole řetězců. Buňka je konfigurována pomocí UIListContentConfiguration — moderního API (iOS 14+), které nahradilo zastaralé textLabel a detailTextLabel. Registrace třídy buňky v viewDidLoad je povinná, jinak aplikace spadne s výjimkou za běhu.
Od iOS 13 Apple doporučuje UICollectionViewCompositionalLayout pro vytváření složitých rozvržení. Vývojář popisuje sekci, skupinu, prvek a jejich velikosti deklarativně — dostává mřížku s libovolnou geometrií: pás, mřížka 2x2, karusel, ornament. Compositional Layout nahradil zastaralý UICollectionViewFlowLayout ve všech nových projektech. V kombinaci s DiffableDataSource se aktualizace kolekce redukuje na jedno volání apply(snapshot) a animace změn se provádí automaticky.
Níže jsou dva praktické příklady použití UIKit v reálných úlohách: vytvoření vlastního pohledu se stínem a zaoblením a zpracování gesta přejetí pro odstranění prvku ze seznamu.
extension UIView {
func applyCardStyle() {
layer.cornerRadius = 12
layer.shadowOpacity = 0.15
layer.shadowRadius = 8
layer.shadowOffset = CGSize(width: 0, height: 2)
layer.masksToBounds = false
}
}
@objc private func handleSwipe(_ gesture: UISwipeGestureRecognizer) {
guard let swipedView = gesture.view else { return }
UIView.animate(withDuration: 0.3) {
swipedView.alpha = 0
swipedView.transform = CGAffineTransform(translationX: 300, y: 0)
} completion: { _ in
swipedView.removeFromSuperview()
}
}
Rozšíření applyCardStyle přidává stín a zaoblení libovolnému pohledu — užitečné pro karty produktů, profily a oznámení. Metoda handleSwipe s animací odstraní prvek, pokud uživatel přejel doprava. Obsluha se přidává na pohled přes addGestureRecognizer s konfigurací UISwipeGestureRecognizer(direction: .right). Nastavení masksToBounds = false je důležité, aby stín nebyl oříznut okraji pohledu.
Pro složitější rozhraní použijte UIStackView — kontejner, který automaticky rozmísťuje vnořené pohledy horizontálně nebo vertikálně. Stack View zjednodušuje rozvržení: není třeba nastavovat omezení pro každý prvek, stačí jedno omezení pro samotný stack.
Často kladené otázky
Frame — obdélník v souřadnicích superview (poloha + velikost). Bounds — obdélník ve vlastních souřadnicích pohledu (vždy začíná od 0,0). Frame se mění při rotate a scale, bounds — ne.
UIKit automaticky uvolňuje pohledy skrytých kontrolérů. Vývojář musí pouze deklarovat vlastnosti pohledů jako weak var, aby ARC mohl uvolnit paměť při varování od systému.
Pro nové projekty Apple doporučuje SwiftUI. Pokud je projekt na UIKit — použijte XIB pro jednotlivé obrazovky nebo programové rozvržení přes SnapKit. Storyboard vytváří konflikty při slučování a zpomaluje sestavení.
Použijte UIColor s podporou traitCollection: UIColor { $0.userInterfaceStyle == .dark ? ... : ... }. Aktivujte Dark Mode v Info.plist klíčem UIUserInterfaceStyle.
UIStackView automaticky vypočítává pozice a velikosti vnořených pohledů na základě alignment, distribution a spacing. To zkracuje kód omezení o 60–80 % a zjednodušuje přizpůsobení různým obrazovkám.
Shrnutí
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í.
Přečtěte si také