Canvas — Xcode interaktiva förhandsgranskningsredigerare som visar SwiftUI View i realtid utan att starta simulatorn. Canvas uppdateras automatiskt vid varje kodändring och stöder gester, navigering och mörkt läge. Enligt Apple Developer Documentation (2026) använder Canvas en separat renderingsprocess PreviewProviderExtension, vilket gör att du kan redigera kod och omedelbart se resultatet utan att omkompilera hela projektet. Läs mer om SwiftUI i materialet om SwiftUI.
Huvudpunkter
Canvas — Xcode inbyggda förhandsgranskningsredigerare, första gången introducerad i Xcode 11 tillsammans med SwiftUI. Den finns i den högra panelen av redigeraren bredvid koden och visar en liveförhandsgranskning av den aktuella SwiftUI View. Canvas fungerar i realtid: varje ändring i koden reflekteras omedelbart i förhandsgranskningen utan manuell omkompilering.
Arkitektoniskt är Canvas en separat process (Preview Provider Extension) som Xcode startar när Canvas öppnas. Processen laddar den kompilerade PreviewProvider, renderar resultatet via Metal och visar det i redigerarpanelen. Om PreviewProvider inte är implementerad visar Canvas meddelandet ”Preview paused — No preview provider found”.
Canvas gränssnitt innehåller ett verktygsfält med val av enhet, orientering, färgschema och skala. Knapparna Live Preview, Selectable och Embed In Diagram växlar interaktionslägen. Canvas stöder split-view: flera Canvas kan öppnas för olika filer i samma arbetsyta.
| Canvas-element | Syfte |
|---|---|
| Device selector | Val av enhet för förhandsgranskning (iPhone, iPad, Apple Watch) |
| Orientation toggle | Växla porträtt/landskap (iOS, iPadOS) |
| Color scheme | Ljust/mörkt läge |
| Dynamic Type slider | Teckensnittsskala för tillgänglighetskontroll |
| Live Preview | Interaktivt läge med geststöd |
| Selectable mode | Inspektera gränssnittselement |
Live Preview — den viktigaste funktionen i Canvas som gör förhandsgranskningen interaktiv. I det här läget renderar Canvas View i en separat process och skickar gester (tryck, svep, scroll) tillbaka till SwiftUI-runtime. Användaren kan trycka på knappar, fylla i textfält och testa navigering utan att starta simulatorn.
SwiftUI bearbetar gester i Canvas genom samma händelsesystem som på en verklig enhet. Skillnaden i prestanda: Canvas använder programvarurendering via Metal, medan simulatorn använder värdgrafik. Detta innebär att komplexa animationer i Canvas kan fungera långsammare eller skilja sig visuellt.
Canvas uppdatering sker i tre steg. Först upptäcker Xcode filändringen och kompilerar inkrementellt endast den ändrade PreviewProvider. Sedan laddas den nya binära modulen in i PreviewProviderExtension-processen. Slutligen återskapar SwiftUI View och renderar den via Metal. Hela cykeln tar 0.5–2 sekunder beroende på View komplexitet.
struct TappableButton: View {
@State private var count = 0
var body: some View {
Button("Tryckt \(count) gånger") {
count += 1
}
.buttonStyle(.borderedProminent)
}
}
struct TappableButton_Previews: PreviewProvider {
static var previews: some View {
TappableButton()
}
}
Interaktivitet: när Live Preview startas fungerar knappen i Canvas som en riktig knapp — räknaren ökar vid varje tryck, tryckanimationen visas. Detta gör att du kan testa knapplogik utan simulator.
Grundinställningar för Canvas är tillgängliga via menyn Editor → Canvas eller via knapparna på Canvas verktygsfält. Huvudalternativen inkluderar val av enhet, orientering, mörkt läge och Dynamic Type-skala. För permanenta inställningar använder du PreviewProvider-modifierare i koden.
Avancerade inställningar inkluderar: Auto Activate Preview — automatisk aktivering av Canvas när en SwiftUI-fil öppnas; Live Preview — läge med gester; Draw Live Edges — visning av vygränser; Show Preview Sizes — storlek på förhandsgranskningsområdet. Xcode sparar dessa inställningar portabelt i workspace/projektfiler.
Programmatisk konfiguration ger mer exakt kontroll över Canvas. Modifierare som tillämpas i previews åsidosätter verktygsfältsinställningar och sparas i koden — alla teammedlemmar ser dem via 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 med .device visar enhetens fulla skärm, och .sizeThatFits — en kompakt förhandsgranskning med storlek anpassad till innehållet. För widgetar och små komponenter, använd .sizeThatFits — det sparar utrymme i redigeraren.
Exempel 1: kontroll av anpassningsförmåga. Använd ForEach med flera enheter och färgscheman för att säkerställa att gränssnittet ser lika bra ut på alla skärmar. Canvas uppdaterar alla förhandsgranskningar samtidigt, så att du kan upptäcka layoutproblem innan du startar simulatorn.
Exempel 2: förhandsgranskning med data. För View som visar dynamiskt innehåll (listor, profiler, kort), skapa flera instanser med olika data i previews. Detta är snabbare än att växla mellan skärmar i simulatorn och mata in data.
Grupp av förhandsgranskningar via Group eller ForEach gör det möjligt att visa alla tillstånd för en komponent på en panel. För en lista är detta särskilt praktiskt: tom lista, laddning, fel och fylld lista är synliga samtidigt.
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 och Simulator kompletterar varandra, inte ersätter. Canvas är idealiskt för snabb iteration vid gränssnittsdesign: kodeditering med omedelbar feedback. Simulatorn är nödvändig för slutlig kontroll: verklig prestanda, anpassade gester, systemvarningar och integration med hårdvarufunktioner (kamera, sensorer).
Enligt WWDC 2024 positionerar Apple Canvas som ett verktyg för utvecklare i tidiga skeden och Simulatorn för integrationstestning. 60% av UI-utvecklingstiden rekommenderas i Canvas, 40% — kontroll på simulator eller enhet.
| Egenskap | Canvas | Simulator |
|---|---|---|
| Uppdateringshastighet | 0.5–2 sek (inkrementell) | 10–60 sek (full byggnad) |
| Gester | Grundläggande (tryck, scroll) | Alla (nyp, rotera, 3D Touch) |
| Kamera/gyroskop | Stöds inte | Simuleras |
| Animationer | Begränsad | Full |
| Push-notiser | Stöds inte | Stöds |
| Nätverk | Genom Xcode-process | Full nätverksstack |
Rekommendation: designa i Canvas, testa på simulatorn. Använd Live Preview för gestlogik för knappar och navigering, men utför slutlig kontroll av animationer, nätverksförfrågningar och hårdvarufunktioner på simulator eller verklig enhet.
Tips 1: använd Selectable-läget. I Selectable-läget (markörikon) kan du klicka på valfritt element i förhandsgranskningen och se dess hierarki, modifierare och ram i inspektorn. Detta är användbart för felsökning av layout: du ser omedelbart padding, offset och elementstorlek utan utskrifter.
Tips 2: Embed In Diagram. Canvas kan gruppera element: välj två eller fler View, klicka på Embed In Diagram — Canvas skapar VStack/HStack/ZStack och skriver automatiskt om koden. Detta påskyndar skapandet av komplex hierarki utan manuell inmatning av parenteser.
Tips 3: rensa Canvas Preview Cache. Om Canvas slutar uppdateras, rensa Product → Preview Cache. Xcode tar bort cachade PreviewProvider binärfiler och bygger om dem från grunden. Detta löser 90% av problemen med frusen Canvas.
Långsam Canvas orsakas vanligtvis av ett överdrivet antal förhandsgranskningar. För komplexa View, använd endast en förhandsgranskning, inte en grupp på 6–8. Stäng av Live Preview för View utan gester — statiskt läge renderar snabbare. Se till att PreviewProvider använder mockar, inte riktiga nätverksförfrågningar.
// Snabb felsökning: minimal förhandsgranskning
struct ComplexView_Previews: PreviewProvider {
static var previews: some View {
ComplexView()
.previewLayout(.sizeThatFits) // kompakt läge
}
}
previewLayout(.sizeThatFits) — det snabbaste Canvas-läget, eftersom endast View innehåll renderas utan enhetsram. Använd det för dagligt arbete, aktivera .device endast för slutlig kontroll.
Vanliga frågor
Den vanligaste orsaken är avsaknad av PreviewProvider för aktuell View. Canvas kräver implementation av PreviewProvider-protokollet med returnering av View i previews-egenskapen. Andra orsaker: kompileringsfel i koden, problem med DerivedData eller PreviewProviderExtension-processen startade inte.
Ja, Xcode stöder felsökning av förhandsgranskning via Product → Preview → Debug Preview. Efter aktivering kommer brytpunkten i View-koden att aktiveras vid Canvas-rendering. Detta gör att du kan analysera körningsvärden för variabler och kontrollera visningslogik.
Canvas stöder UIKit-komponenter via UIViewRepresentable och UIViewControllerRepresentable. Vissa komponenter renderas dock inte: MapKit, WebView, video via AVPlayer, anpassade Metal/GLKit-vyer. Canvas emulerar inte hårdvarufunktioner, så kamera och sensorer är inte tillgängliga.
Minska antalet förhandsgranskningar i Group (max 3–4), använd previewLayout(.sizeThatFits) istället för .device, stäng av Live Preview för View utan gester. Rensa Product → Preview Cache. Se till att PreviewProvider inte gör nätverksförfrågningar — använd mockdata.
Canvas påverkar inte storleken på slutlig IPA — PreviewProvider-kod kompileras endast i Debug-konfiguration. Under utveckling lägger Canvas till 100–200 MB cache i DerivedData, som hanteras automatiskt av Xcode. Regelbunden rensning av DerivedData frigör utrymme.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också