Canvas é um editor de pré-visualização interativo do Xcode que exibe SwiftUI View em tempo real sem iniciar o simulador. O Canvas é atualizado automaticamente a cada alteração no código e suporta gestos, navegação e modo escuro. De acordo com a Apple Developer Documentation (2026), o Canvas utiliza um processo de renderização separado PreviewProviderExtension, permitindo editar o código e ver o resultado imediatamente sem recompilar todo o projeto. Leia mais sobre SwiftUI no artigo sobre SwiftUI.
Principais pontos
Canvas é um editor de pré-visualização integrado no Xcode, apresentado pela primeira vez no Xcode 11 juntamente com o SwiftUI. Ele está localizado no painel direito do editor ao lado do código e exibe uma pré-visualização ao vivo da SwiftUI View atual. O Canvas funciona em tempo real: cada alteração no código é refletida instantaneamente na pré-visualização sem recompilação manual.
Arquiteturalmente, o Canvas é um processo separado (Preview Provider Extension) que o Xcode inicia ao abrir o Canvas. O processo carrega o PreviewProvider compilado, renderiza o resultado através do Metal e exibe no painel do editor. Se o PreviewProvider não estiver implementado, o Canvas mostra um placeholder “Preview paused — No preview provider found”.
A interface do Canvas inclui uma barra de ferramentas com seleção de dispositivo, orientação, esquema de cores e escala. Os botões Live Preview, Selectable e Embed In Diagram alternam os modos de interação. O Canvas suporta visualização dividida: você pode abrir vários Canvas para diferentes arquivos no mesmo espaço de trabalho.
| Elemento do Canvas | Finalidade |
|---|---|
| Seletor de dispositivo | Selecionar dispositivo para pré-visualização (iPhone, iPad, Apple Watch) |
| Alternar orientação | Alternar retrato/paisagem (iOS, iPadOS) |
| Esquema de cores | Tema claro/escuro |
| Controle deslizante Dynamic Type | Escala de fonte para testes de acessibilidade |
| Live Preview | Modo interativo com suporte a gestos |
| Modo selecionável | Inspeção de elementos da interface |
Live Preview é o recurso principal do Canvas que torna as pré-visualizações interativas. Neste modo, o Canvas renderiza a View em um processo separado e passa os gestos (toque, deslize, rolagem) de volta para o runtime do SwiftUI. O usuário pode pressionar botões, preencher campos de texto e testar a navegação sem iniciar o simulador.
SwiftUI processa os gestos no Canvas através do mesmo sistema de eventos que em um dispositivo real. A diferença está no desempenho: o Canvas usa renderização por software através do Metal, enquanto o simulador usa gráficos do host. Isso significa que animações complexas no Canvas podem funcionar mais lentamente ou parecer diferentes visualmente.
A atualização do Canvas ocorre em três etapas. Primeiro, o Xcode detecta a alteração no arquivo e compila incrementalmente apenas o PreviewProvider modificado. Em seguida, o novo módulo binário é carregado no processo PreviewProviderExtension. Finalmente, o SwiftUI recria a View e a renderiza através do Metal. Todo o ciclo leva de 0,5 a 2 segundos, dependendo da complexidade da View.
struct TappableButton: View {
@State private var count = 0
var body: some View {
Button("Tapped \(count) times") {
count += 1
}
.buttonStyle(.borderedProminent)
}
}
struct TappableButton_Previews: PreviewProvider {
static var previews: some View {
TappableButton()
}
}
Interatividade: quando o Live Preview está em execução, o botão no Canvas funciona como um real — o contador aumenta a cada toque e a animação de pressão é exibida. Isso permite testar a lógica dos botões sem o simulador.
Configurações básicas do Canvas estão disponíveis através do menu Editor → Canvas ou dos botões da barra de ferramentas do Canvas. As principais opções incluem seleção de dispositivo, orientação, tema escuro e escala Dynamic Type. Para configurações persistentes, use modificadores PreviewProvider no código.
Configurações avançadas incluem: Auto Activate Preview — ativação automática do Canvas ao abrir um arquivo SwiftUI; Live Preview — modo com gestos; Draw Live Edges — exibir bordas da view; Show Preview Sizes — tamanho da área de pré-visualização. O Xcode salva essas configurações de forma portátil nos arquivos do workspace/projeto.
Configuração programática dá um controle mais preciso sobre o Canvas. Os modificadores aplicados nas pré-visualizações substituem as configurações da barra de ferramentas e são salvos no código — todos os membros da equipe os veem através do 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 com .device exibe a tela completa do dispositivo, enquanto .sizeThatFits mostra uma pré-visualização compacta com tamanho ajustado ao conteúdo. Para widgets e componentes pequenos, use .sizeThatFits — economiza espaço no editor.
Exemplo 1: teste de adaptabilidade. Use ForEach com vários dispositivos e esquemas de cores para garantir que a interface fique boa em todas as telas. O Canvas atualiza todas as pré-visualizações simultaneamente, permitindo detectar problemas de layout antes de iniciar o simulador.
Exemplo 2: pré-visualização com dados. Para Views que exibem conteúdo dinâmico (listas, perfis, cartões), crie várias instâncias com dados diferentes nas pré-visualizações. Isso é mais rápido do que alternar entre telas no simulador e inserir dados.
Grupo de pré-visualizações através de Group ou ForEach permite exibir todos os estados do componente em um único painel. Para listas, isso é especialmente conveniente: lista vazia, carregamento, erro e lista preenchida são visíveis simultaneamente.
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 e Simulador se complementam, em vez de se substituir. O Canvas é ideal para iteração rápida durante a layout: editar código com feedback imediato. O Simulador é necessário para a verificação final: desempenho real, gestos personalizados, alertas do sistema e integração com recursos de hardware (câmera, sensores).
De acordo com a WWDC 2024, a Apple posiciona o Canvas como uma ferramenta para os estágios iniciais de desenvolvimento e o Simulador para testes de integração. Recomenda-se gastar 60% do tempo de desenvolvimento de UI no Canvas e 40% — testando no simulador ou dispositivo.
| Característica | Canvas | Simulador |
|---|---|---|
| Velocidade de atualização | 0,5–2 seg (incremental) | 10–60 seg (compilação completa) |
| Gestos | Básicos (toque, rolagem) | Todos (pinça, rotação, 3D Touch) |
| Câmera/giroscópio | Não suportado | Simulado |
| Animações | Limitadas | Completas |
| Notificações push | Não suportado | Suportado |
| Rede | Através do processo Xcode | Pilha de rede completa |
Recomendação: projete no Canvas, teste no simulador. Use o Live Preview para lógica de gestos de botões e navegação, mas os testes finais de animações, solicitações de rede e funções de hardware devem ser feitos no simulador ou em um dispositivo real.
Dica 1: use o modo selecionável. No modo selecionável (ícone de cursor), você pode clicar em qualquer elemento da pré-visualização e ver sua hierarquia, modificadores e moldura no inspetor. Isso é útil para depuração de layout: você vê instantaneamente o padding, offset e tamanho do elemento sem prints.
Dica 2: Embed In Diagram. O Canvas pode agrupar elementos: selecione duas ou mais Views, clique em Embed In Diagram — o Canvas criará VStack/HStack/ZStack e reconstruirá o código automaticamente. Isso acelera a criação de hierarquias complexas sem digitar colchetes manualmente.
Dica 3: limpar cache de pré-visualização do Canvas. Se o Canvas parar de atualizar, limpe Product → Preview Cache. O Xcode excluirá os binários em cache do PreviewProvider e os reconstruirá do zero. Isso resolve 90% dos problemas de congelamento do Canvas.
Canvas lento geralmente é causado por um número excessivo de pré-visualizações. Para Views complexas, use apenas uma pré-visualização em vez de um grupo de 6 a 8. Desligue o Live Preview para Views sem gestos — o modo estático renderiza mais rápido. Certifique-se de que o PreviewProvider use mocks em vez de solicitações de rede reais.
// Quick debug: minimal preview
struct ComplexView_Previews: PreviewProvider {
static var previews: some View {
ComplexView()
.previewLayout(.sizeThatFits) // compact mode
}
}
previewLayout(.sizeThatFits) é o modo mais rápido do Canvas porque renderiza apenas o conteúdo da View sem as bordas do dispositivo. Use-o para layout diário, ativando .device apenas para verificações finais.
Perguntas frequentes
A razão mais comum é a ausência de PreviewProvider para a View atual. O Canvas requer a implementação do protocolo PreviewProvider retornando uma View na propriedade previews. Outras razões: erro de compilação no código, problemas com DerivedData ou o processo PreviewProviderExtension não iniciou.
Sim, o Xcode suporta depuração de pré-visualização através de Product → Preview → Debug Preview. Após a ativação, um breakpoint no código da View será acionado ao renderizar o Canvas. Isso permite analisar valores de variáveis em tempo de execução e verificar a lógica de exibição.
O Canvas suporta componentes UIKit através de UIViewRepresentable e UIViewControllerRepresentable. No entanto, alguns componentes não renderizam: MapKit, WebView, vídeo via AVPlayer, views personalizadas Metal/GLKit. O Canvas não emula capacidades de hardware, portanto câmera e sensores não estão disponíveis.
Reduza o número de pré-visualizações em um Group (máximo 3–4), use previewLayout(.sizeThatFits) em vez de .device, desligue o Live Preview para Views sem gestos. Limpe Product → Preview Cache. Certifique-se de que o PreviewProvider não faça solicitações de rede — use dados mock.
O Canvas não afeta o tamanho do IPA de lançamento — o código PreviewProvider é compilado apenas na configuração Debug. Durante o desenvolvimento, o Canvas adiciona até 100–200 MB de cache no DerivedData, que é gerenciado automaticamente pelo Xcode. A limpeza regular do DerivedData libera espaço.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também