Canvas — interaktivní editor náhledu Xcode, který zobrazuje SwiftUI View v reálném čase bez spuštění simulátoru. Canvas se automaticky aktualizuje při každé změně kódu a podporuje gesta, navigaci a tmavý režim. Podle Apple Developer Documentation (2026), Canvas používá samostatný proces renderování PreviewProviderExtension, což umožňuje upravovat kód a okamžitě vidět výsledek bez překompilování celého projektu. Více o SwiftUI si přečtěte v materiálu o SwiftUI.
Hlavní body
Canvas — vestavěný editor náhledu Xcode, poprvé představený v Xcode 11 společně se SwiftUI. Nachází se v pravém panelu editoru vedle kódu a zobrazuje živý náhled aktuální SwiftUI View. Canvas pracuje v reálném čase: každá změna v kódu se okamžitě projeví v náhledu bez ručního překompilování.
Architektonicky je Canvas samostatný proces (Preview Provider Extension), který Xcode spouští při otevření Canvas. Proces načte zkompilovaný PreviewProvider, vykreslí výsledek přes Metal a zobrazí jej v panelu editoru. Pokud PreviewProvider není implementován, Canvas zobrazí zprávu „Preview paused — No preview provider found”.
Rozhraní Canvas zahrnuje panel nástrojů s výběrem zařízení, orientace, barevného schématu a měřítka. Tlačítka Live Preview, Selectable a Embed In Diagram přepínají režimy interakce. Canvas podporuje split-view: lze otevřít více Canvas pro různé soubory v jedné pracovní oblasti.
| Prvek Canvas | Účel |
|---|---|
| Device selector | Výběr zařízení pro náhled (iPhone, iPad, Apple Watch) |
| Orientation toggle | Přepnutí portrét/na šířku (iOS, iPadOS) |
| Color scheme | Světlý/tmavý režim |
| Dynamic Type slider | Měřítko písma pro kontrolu přístupnosti |
| Live Preview | Interaktivní režim s podporou gest |
| Selectable mode | Inspekce prvků rozhraní |
Live Preview — klíčová možnost Canvas, která dělá náhled interaktivním. V tomto režimu Canvas vykresluje View v samostatném procesu a předává gesta (ťuknutí, přejetí, rolování) zpět do runtime SwiftUI. Uživatel může mačkat tlačítka, vyplňovat textová pole a testovat navigaci bez spuštění simulátoru.
SwiftUI zpracovává gesta v Canvas prostřednictvím stejného systému událostí jako na skutečném zařízení. Rozdíl ve výkonu: Canvas používá softwarové vykreslování přes Metal, zatímco simulátor používá hostitelskou grafiku. To znamená, že složité animace v Canvas mohou pracovat pomaleji nebo se vizuálně lišit.
Aktualizace Canvas probíhá ve třech fázích. Nejprve Xcode detekuje změnu souboru a inkrementálně zkompiluje pouze změněný PreviewProvider. Poté se nový binární modul načte do procesu PreviewProviderExtension. Nakonec SwiftUI znovu vytvoří View a vykreslí ji přes Metal. Celý cyklus trvá 0.5–2 sekundy v závislosti na složitosti View.
struct TappableButton: View {
@State private var count = 0
var body: some View {
Button("\(count) klepnutí") {
count += 1
}
.buttonStyle(.borderedProminent)
}
}
struct TappableButton_Previews: PreviewProvider {
static var previews: some View {
TappableButton()
}
}
Interaktivita: po spuštění Live Preview tlačítko v Canvas funguje jako skutečné — počítadlo se zvyšuje při každém stisknutí, animace stisknutí se zobrazuje. To umožňuje testovat logiku tlačítek bez simulátoru.
Základní nastavení Canvas jsou přístupná přes menu Editor → Canvas nebo pomocí tlačítek na panelu nástrojů samotného Canvas. Hlavní možnosti zahrnují výběr zařízení, orientace, tmavého režimu a měřítka Dynamic Type. Pro trvalá nastavení použijte modifikátory PreviewProvider v kódu.
Pokročilá nastavení zahrnují: Auto Activate Preview — automatické zapnutí Canvas při otevření SwiftUI souboru; Live Preview — režim s gesty; Draw Live Edges — zobrazení okrajů pohledu; Show Preview Sizes — velikost oblasti náhledu. Xcode ukládá tato nastavení přenosně v souborech workspace/projektu.
Programové nastavení poskytuje přesnější kontrolu nad Canvas. Modifikátory aplikované v previews přepisují nastavení panelu nástrojů a ukládají se v kódu — všichni členové týmu je vidí přes git.
struct SettingsView_Previews: PreviewProvider {
static var previews: some View {
SettingsView()
.previewDevice("iPhone 16 Pro")
.previewLayout(.device)
.preferredColorScheme(.dark)
.dynamicTypeSize(.xxxLarge)
.previewDisplayName("Dark + XL Text")
}
}
previewLayout s .device zobrazuje celou obrazovku zařízení, a .sizeThatFits — kompaktní náhled s velikostí přizpůsobenou obsahu. Pro widgety a malé komponenty použijte .sizeThatFits — šetří místo v editoru.
Příklad 1: kontrola přizpůsobivosti. Použijte ForEach s několika zařízeními a barevnými schématy, abyste se ujistili, že rozhraní vypadá stejně dobře na všech obrazovkách. Canvas aktualizuje všechny náhledy současně, což umožňuje zaznamenat problémy s rozložením před spuštěním simulátoru.
Příklad 2: náhled s daty. Pro View zobrazující dynamický obsah (seznamy, profily, karty) vytvořte několik instancí s různými daty v previews. To je rychlejší než přepínání mezi obrazovkami v simulátoru a zadávání dat.
Skupina náhledů přes Group nebo ForEach umožňuje zobrazit všechny stavy komponenty na jednom panelu. Pro seznam je to obzvláště výhodné: prázdný seznam, načítání, chyba a naplněný seznam jsou viditelné současně.
struct LoadingStateView: View {
let state: LoadingState
var body: some View {
switch state {
case .loading:
ProgressView()
case .loaded(let items):
List(items, id: \.self) { Text($0) }
case .error(let message):
Text(message).foregroundColor(.red)
}
}
}
struct LoadingStateView_Previews: PreviewProvider {
static var previews: some View {
Group {
LoadingStateView(state: .loading)
.previewDisplayName("Loading")
LoadingStateView(state: .loaded(["Item 1", "Item 2"]))
.previewDisplayName("Loaded")
LoadingStateView(state: .error("Failed to load"))
.previewDisplayName("Error")
}
}
}
Canvas a Simulator se doplňují, nenahrazují. Canvas je ideální pro rychlou iteraci při tvorbě rozhraní: úprava kódu s okamžitou zpětnou vazbou. Simulator je nezbytný pro konečnou kontrolu: skutečný výkon, vlastní gesta, systémové alerty a integrace s hardwarovými funkcemi (kamera, senzory).
Podle WWDC 2024 Apple staví Canvas jako nástroj pro vývojáře v raných fázích a Simulator pro fázi integračního testování. 60% času vývoje UI se doporučuje strávit v Canvas, 40% — zkontrolovat na simulátoru nebo zařízení.
| Vlastnost | Canvas | Simulator |
|---|---|---|
| Rychlost aktualizace | 0.5–2 s (inkrementální) | 10–60 s (plné sestavení) |
| Gesta | Základní (ťuknutí, rolování) | Všechna (pinch, rotate, 3D Touch) |
| Kamera/gyroskop | Nepodporováno | Simuluje se |
| Animace | Omezené | Plné |
| Push notifikace | Nepodporováno | Podporováno |
| Síť | Přes proces Xcode | Plný síťový stack |
Doporučení: tvořte rozhraní v Canvas, testujte na simulatoru. Použijte Live Preview pro logiku gest tlačítek a navigace, ale konečnou kontrolu animací, síťových požadavků a hardwarových funkcí proveďte na simulátoru nebo skutečném zařízení.
Tip 1: používejte režim Selectable. V režimu Selectable (ikona kurzoru) můžete kliknout na libovolný prvek náhledu a vidět jeho hierarchii, modifikátory a rámec v inspektoru. To je užitečné pro ladění rozložení: okamžitě vidíte padding, offset a velikost prvku bez výpisů.
Tip 2: Embed In Diagram. Canvas umí seskupovat prvky: vyberte dvě nebo více View, klikněte Embed In Diagram — Canvas vytvoří VStack/HStack/ZStack a automaticky přepíše kód. To urychluje vytváření složité hierarchie bez ručního zadávání závorek.
Tip 3: čištění mezipaměti Canvas Preview. Pokud Canvas přestal aktualizovat, vyčistěte Product → Preview Cache. Xcode odstraní zazálohované binární soubory PreviewProvider a sestaví je znovu. To řeší 90% problémů se zaseknutým Canvas.
Pomalý Canvas je obvykle způsoben nadměrným počtem náhledů. Pro složité View použijte pouze jeden náhled, ne skupinu 6–8. Vypněte Live Preview pro View bez gest — statický režim renderuje rychleji. Ujistěte se, že PreviewProvider používá mocky, ne skutečné síťové požadavky.
// Rychlé ladění: minimální náhled
struct ComplexView_Previews: PreviewProvider {
static var previews: some View {
ComplexView()
.previewLayout(.sizeThatFits) // kompaktní režim
}
}
previewLayout(.sizeThatFits) — nejrychlejší režim Canvas, protože se vykresluje pouze obsah View bez rámečku zařízení. Používejte jej pro každodenní práci, .device zapněte pouze pro konečnou kontrolu.
Často kladené otázky
Nejčastější příčinou je chybějící PreviewProvider pro aktuální View. Canvas vyžaduje implementaci protokolu PreviewProvider s vrácením View ve vlastnosti previews. Další příčiny: chyba kompilace v kódu, problémy s DerivedData nebo proces PreviewProviderExtension se nespustil.
Ano, Xcode podporuje ladění náhledu přes Product → Preview → Debug Preview. Po aktivaci se breakpoint v kódu View spustí při renderování Canvas. To umožňuje analyzovat runtime hodnoty proměnných a kontrolovat logiku zobrazení.
Canvas podporuje UIKit komponenty přes UIViewRepresentable a UIViewControllerRepresentable. Některé komponenty se však nerenrují: MapKit, WebView, video přes AVPlayer, vlastní Metal/GLKit pohledy. Canvas neemuluje hardwarové možnosti, proto kamera a senzory nejsou k dispozici.
Snižte počet náhledů v Group (max 3–4), použijte previewLayout(.sizeThatFits) místo .device, vypněte Live Preview pro View bez gest. Vyčistěte Product → Preview Cache. Ujistěte se, že PreviewProvider neprovádí síťové požadavky — použijte mock data.
Canvas neovlivňuje velikost výsledného IPA — kód PreviewProvider se kompiluje pouze v Debug konfiguraci. Během vývoje Canvas přidá 100–200 MB mezipaměti do DerivedData, kterou Xcode automaticky spravuje. Pravidelné čištění DerivedData uvolňuje místo.
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é