Canvas — interaktywny edytor podglądu Xcode, który wyświetla SwiftUI View w czasie rzeczywistym bez uruchamiania symulatora. Canvas aktualizuje się automatycznie przy każdej zmianie kodu i obsługuje gesty, nawigację i tryb ciemny. Według Apple Developer Documentation (2026), Canvas używa oddzielnego procesu renderowania PreviewProviderExtension, co pozwala edytować kod i natychmiast widzieć efekt bez ponownej kompilacji całego projektu. Więcej o SwiftUI przeczytasz w materiale o SwiftUI.
Najważniejsze
Canvas — wbudowany edytor podglądu Xcode, po raz pierwszy przedstawiony w Xcode 11 razem ze SwiftUI. Znajduje się w prawym panelu edytora obok kodu i wyświetla podgląd na żywo bieżącej SwiftUI View. Canvas działa w trybie rzeczywistym: każda zmiana w kodzie natychmiast odzwierciedla się w podglądzie bez ręcznej rekompilacji.
Architektonicznie Canvas to oddzielny proces (Preview Provider Extension), który Xcode uruchamia przy otwarciu Canvas. Proces ładuje skompilowany PreviewProvider, renderuje wynik przez Metal i wyświetla w panelu edytora. Jeśli PreviewProvider nie jest zaimplementowany, Canvas pokazuje zastępczy komunikat „Preview paused — No preview provider found”.
Interfejs Canvas zawiera panel narzędzi z wyborem urządzenia, orientacji, schematu kolorów i skali. Przyciski Live Preview, Selectable i Embed In Diagram przełączają tryby interakcji. Canvas obsługuje split-view: można otworzyć kilka Canvas dla różnych plików w jednym obszarze roboczym.
| Element Canvas | Przeznaczenie |
|---|---|
| Device selector | Wybór urządzenia dla podglądu (iPhone, iPad, Apple Watch) |
| Orientation toggle | Przełączanie portret/krajobraz (iOS, iPadOS) |
| Color scheme | Tryb jasny/ciemny |
| Dynamic Type slider | Skala czcionki do testowania accessibility |
| Live Preview | Tryb interaktywny z obsługą gestów |
| Selectable mode | Inspekcja elementów interfejsu |
Live Preview — kluczowa możliwość Canvas, która czyni podgląd interaktywnym. W tym trybie Canvas renderuje View w oddzielnym procesie i przekazuje gesty (tapnięcie, przesunięcie, przewijanie) z powrotem do środowiska wykonawczego SwiftUI. Użytkownik może naciskać przyciski, wypełniać pola tekstowe i testować nawigację bez uruchamiania symulatora.
SwiftUI obsługuje gesty w Canvas przez ten sam system zdarzeń, co na rzeczywistym urządzeniu. Różnica w wydajności: Canvas używa renderowania programowego przez Metal, podczas gdy symulator — grafikę hosta. Oznacza to, że złożone animacje w Canvas mogą działać wolniej lub różnić się wizualnie.
Aktualizacja Canvas odbywa się w trzech etapach. Najpierw Xcode wykrywa zmianę pliku i kompiluje inkrementalnie tylko zmieniony PreviewProvider. Następnie nowy moduł binarny jest ładowany do procesu PreviewProviderExtension. W końcu SwiftUI odtwarza View i renderuje je przez Metal. Cały cykl trwa 0.5–2 sekund w zależności od złożoności View.
struct TappableButton: View {
@State private var count = 0
var body: some View {
Button("Dotknięto \(count) razy") {
count += 1
}
.buttonStyle(.borderedProminent)
}
}
struct TappableButton_Previews: PreviewProvider {
static var previews: some View {
TappableButton()
}
}
Interaktywność: po uruchomieniu Live Preview przycisk w Canvas działa jak prawdziwy — licznik zwiększa się przy każdym naciśnięciu, animacja naciśnięcia jest wyświetlana. Pozwala to testować logikę przycisków bez symulatora.
Podstawowe ustawienia Canvas są dostępne przez menu Editor → Canvas lub przez przyciski na panelu narzędzi samego Canvas. Główne opcje obejmują wybór urządzenia, orientacji, trybu ciemnego i skali Dynamic Type. Do stałych ustawień używaj modyfikatorów PreviewProvider w kodzie.
Zaawansowane ustawienia obejmują: Auto Activate Preview — automatyczne włączanie Canvas przy otwieraniu pliku SwiftUI; Live Preview — tryb z gestami; Draw Live Edges — wyświetlanie granic widoków; Show Preview Sizes — rozmiar obszaru podglądu. Xcode zapisuje te ustawienia przenośnie w plikach workspace/projektu.
Konfiguracja programowa zapewnia dokładniejszą kontrolę nad Canvas. Modyfikatory zastosowane w previews nadpisują ustawienia panelu narzędzi i są przechowywane w kodzie — widzą je wszyscy członkowie zespołu przez 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 z .device wyświetla pełny ekran urządzenia, a .sizeThatFits — kompaktowy podgląd z rozmiarem dopasowanym do zawartości. Dla widżetów i małych komponentów używaj .sizeThatFits — to oszczędza miejsce w edytorze.
Przykład 1: testowanie adaptywności. Użyj ForEach z kilkoma urządzeniami i schematami kolorów, aby upewnić się, że interfejs wygląda dobrze na wszystkich ekranach. Canvas aktualizuje wszystkie podglądy jednocześnie, pozwalając zauważyć problemy z układem przed uruchomieniem symulatora.
Przykład 2: podgląd z danymi. Dla View wyświetlających dynamiczną treść (listy, profile, karty) twórz kilka instancji z różnymi danymi w previews. To szybsze niż przełączanie się między ekranami w symulatorze i wprowadzanie danych.
Grupa podglądów przez Group lub ForEach pozwala wyświetlić wszystkie stany komponentu na jednym panelu. Dla listy jest to szczególnie wygodne: pusta lista, ładowanie, błąd i wypełniona lista są widoczne jednocześnie.
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 i Simulator uzupełniają się, a nie zastępują. Canvas jest idealny do szybkiej iteracji podczas tworzenia interfejsu: edycja kodu z natychmiastowym sprzężeniem zwrotnym. Simulator jest niezbędny do końcowej weryfikacji: rzeczywista wydajność, niestandardowe gesty, alerty systemowe i integracja z funkcjami sprzętowymi (kamera, czujniki).
Według WWDC 2024, Apple pozycjonuje Canvas jako narzędzie dla programisty na wczesnych etapach, a Simulator — na etapie testów integracyjnych. 60% czasu tworzenia UI zaleca się spędzać w Canvas, 40% — testować na symulatorze lub urządzeniu.
| Cecha | Canvas | Simulator |
|---|---|---|
| Szybkość aktualizacji | 0.5–2 s (inkrementalna) | 10–60 s (pełna kompilacja) |
| Gesty | Podstawowe (tap, scroll) | Wszystkie (pinch, rotate, 3D Touch) |
| Kamera/żyroskop | Nieobsługiwane | Symulowane |
| Animacje | Ograniczone | Pełne |
| Push notifications | Nieobsługiwane | Obsługiwane |
| Sieć | Przez proces Xcode | Pełny stos sieciowy |
Zalecenie: twórz interfejs w Canvas, testuj na symulatorze. Użyj Live Preview do logiki gestów przycisków i nawigacji, ale końcową weryfikację animacji, zapytań sieciowych i funkcji sprzętowych przeprowadź na symulatorze lub rzeczywistym urządzeniu.
Porada 1: używaj trybu Selectable. W trybie Selectable (ikona kursora) można kliknąć na dowolny element podglądu i zobaczyć jego hierarchię, modyfikatory i ramkę w inspektorze. Jest to przydatne do debugowania układu: natychmiast widzisz padding, offset i rozmiar elementu bez printów.
Porada 2: Embed In Diagram. Canvas umie grupować elementy: zaznacz dwie lub więcej View, kliknij Embed In Diagram — Canvas utworzy VStack/HStack/ZStack i automatycznie przepisze kod. To przyspiesza tworzenie złożonej hierarchii bez ręcznego wpisywania nawiasów.
Porada 3: czyszczenie pamięci podręcznej Canvas. Jeśli Canvas przestał się aktualizować, wyczyść Product → Preview Cache. Xcode usunie zbuforowane binarne pliki PreviewProvider i zbuduje je od nowa. To rozwiązuje 90% problemów z zawieszonym Canvas.
Wolny Canvas jest zwykle spowodowany nadmierną liczbą podglądów. Dla złożonych View używaj tylko jednego podglądu, a nie grupy 6–8. Wyłącz Live Preview dla View bez gestów — tryb statyczny renderuje się szybciej. Upewnij się, że PreviewProvider używa mocków, a nie rzeczywistych zapytań sieciowych.
// Szybkie debugowanie: minimalny podgląd
struct ComplexView_Previews: PreviewProvider {
static var previews: some View {
ComplexView()
.previewLayout(.sizeThatFits) // tryb kompaktowy
}
}
previewLayout(.sizeThatFits) — najszybszy tryb Canvas, ponieważ renderowana jest tylko zawartość View bez ramek urządzenia. Używaj go do codziennej pracy nad interfejsem, włączaj .device tylko do końcowej weryfikacji.
Często zadawane pytania
Najczęstszą przyczyną jest brak PreviewProvider dla bieżącej View. Canvas wymaga implementacji protokołu PreviewProvider z zwróceniem View we właściwości previews. Inne przyczyny: błąd kompilacji w kodzie, problemy z DerivedData lub proces PreviewProviderExtension nie uruchomił się.
Tak, Xcode obsługuje debugowanie podglądu przez Product → Preview → Debug Preview. Po aktywacji breakpoint w kodzie View zadziała podczas renderowania Canvas. Pozwala to analizować wartości zmiennych w czasie wykonania i sprawdzać logikę wyświetlania.
Canvas obsługuje komponenty UIKit przez UIViewRepresentable i UIViewControllerRepresentable. Jednak niektóre komponenty nie renderują się: MapKit, WebView, wideo przez AVPlayer, niestandardowe Metal/GLKit widoki. Canvas nie emuluje możliwości sprzętowych, dlatego kamera i czujniki są niedostępne.
Zmniejsz liczbę podglądów w Group (maks. 3–4), używaj previewLayout(.sizeThatFits) zamiast .device, wyłącz Live Preview dla View bez gestów. Wyczyść Product → Preview Cache. Upewnij się, że PreviewProvider nie wykonuje zapytań sieciowych — używaj danych mockowych.
Canvas nie wpływa na rozmiar końcowego IPA — kod PreviewProvider jest kompilowany tylko w konfiguracji Debug. Podczas tworzenia Canvas dodaje do 100–200 MB pamięci podręcznej w DerivedData, która jest automatycznie zarządzana przez Xcode. Regularne czyszczenie DerivedData zwalnia miejsce.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również