CALayer: o que é, conceitos-chave e renderização de camadas

Autor: IT Sectr Publicado: 2026-06-12 Tempo de leitura: 10 min

CALayer é a classe base para camadas gráficas no iOS, parte do framework QuartzCore. Cada UIView no iOS possui um CALayer associado que lida com a renderização de conteúdo, animação e composição na GPU. De acordo com Apple QuartzCore Documentation, 2025, o CALayer suporta mais de 40 propriedades animáveis e funciona diretamente através do Metal. Compreender o CALayer é essencial para criar animações suaves e otimizar o desempenho da interface.

Pontos-chave

  • CALayer é o bloco fundamental da representação visual no iOS, gerenciando rasterização e composição.
  • Cada UIView contém uma camada acessível através da propriedade layer — os desenvolvedores podem personalizar visuais sem criar uma subclasse de UIView.
  • Core Animation usa CALayer para animar propriedades: position, bounds, opacity, transform, backgroundColor.
  • As subclasses de CALayer — CAShapeLayer, CATextLayer, CAGradientLayer, CAEmitterLayer — resolvem tarefas específicas de renderização.
  • A renderização do CALayer é realizada na GPU através do Metal, garantindo 60 FPS com configuração adequada da camada.

O que é CALayer?

CALayer é uma classe do framework QuartzCore que gerencia uma imagem bitmap de uma área retangular da tela. Ela armazena propriedades visuais: frame, backgroundColor, opacity, shadow, border, transform. Ao contrário do UIView, o CALayer não lida com eventos de toque, não participa do Auto Layout e não tem ciclo de vida de view controller.

Arquiteturalmente, o CALayer implementa o padrão Model no contexto do Core Animation. A camada armazena o estado das propriedades visuais, enquanto o Core Animation gerencia a interpolação entre estados durante a animação. Essa separação permite animar qualquer propriedade da camada sem precisar redesenhar o conteúdo através de drawRect.

De acordo com a Apple WWDC 2024, o CALayer foi reescrito para funcionar através do Metal. O pipeline de renderização moderno inclui três etapas: Commit (atualização de propriedades na CPU), Render (geração de comandos de GPU na CPU) e Composite (execução de comandos na GPU). O CALayer participa de todas as três etapas, fornecendo dados para cada uma.

Cada camada pode conter sublayers — camadas filhas que renderizam sobre a camada pai. A hierarquia de camadas reflete a hierarquia do UIView, mas pode existir independentemente dela. Os desenvolvedores podem criar camadas independentemente do UIView através de CALayer() e adicioná-las à hierarquia via addSublayer.

Diferença entre CALayer e UIView

UIView é um invólucro sobre CALayer que adiciona: manipulação de toque via UIResponder, participação no Auto Layout, representação em storyboard e integração com UIViewController. CALayer é um objeto leve que pode ser usado sem UIView para elementos puramente visuais.

Na prática, isso significa que se um elemento não precisa de manipulação de toque ou layout, ele pode ser implementado como CALayer. Por exemplo, animações de fundo, indicadores de carregamento, elementos decorativos — tudo isso é mais eficiente implementado via CALayer, evitando a sobrecarga do UIView.

Propriedades principais do CALayer

As propriedades básicas do CALayer incluem frame, posicionamento, exibição e efeitos visuais. frame define a área retangular da camada em coordenadas do pai, bounds define coordenadas internas, e position define o centro da camada. A alteração de position é animada por padrão através de animação implícita.

  • backgroundColor — a cor de fundo da camada (CGColor). Definir uma cor opaca com opaque = true elimina a mistura alfa.
  • cornerRadius — arredondamento de cantos. Processado por hardware sem passes de renderização adicionais.
  • borderWidth e borderColor — borda da camada. Renderizado na GPU, não requer drawRect.
  • shadowOffset, shadowRadius, shadowOpacity, shadowPath — sombra. Um shadowPath explícito acelera significativamente a renderização.
  • opacity — transparência da camada de 0.0 a 1.0. Anima sem chamar drawRect.
  • transform — CATransform3D para transformações 2D e 3D. Suporta distorções de perspectiva.

A propriedade contents permite definir conteúdo bitmap diretamente — através de CGImage ou CIImage. Esta é uma alternativa ao desenho via drawRect: se a imagem já estiver pronta, ela pode ser passada para contents, e o Core Animation a renderizará sem processamento adicional.

Para animação, são usados CABasicAnimation, CAKeyframeAnimation e CATransition. Todas essas classes funcionam através de key paths de propriedades do CALayer, permitindo animar praticamente qualquer atributo — desde position até transform.rotation.z.

Subclasses do CALayer e sua finalidade

Apple fornece várias subclasses especializadas do CALayer, cada uma resolvendo uma tarefa específica. Escolher a subclasse adequada em vez do CALayer base pode proporcionar melhorias significativas de desempenho através de aceleração por hardware.

  • CAShapeLayer — renderiza formas vetoriais (CGPath) na GPU. Não requer um buffer separado — a forma é renderizada como parte da composição da camada pai.
  • CATextLayer — renderização de texto com suavização subpixel. Armazena em cache glifos, acelerando a exibição de texto repetido.
  • CAGradientLayer — gradientes lineares e radiais. Renderização por hardware sem gerar imagens intermediárias.
  • CAEmitterLayer — sistema de partículas na GPU. Cada partícula é renderizada como um elemento separado sem envolvimento da CPU.
  • CAReplicatorLayer — criação automática de cópias de camadas filhas com deslocamentos configuráveis em posição, cor e tempo.
  • CATiledLayer — renderização de imagens grandes por tiles. Carrega e exibe apenas fragmentos visíveis.

CAReplicatorLayer é especialmente útil para criar padrões repetitivos sem duplicação de código. Por exemplo, um indicador de carregamento com 10 pontos é implementado com um CAReplicatorLayer usando instanceCount = 10 e deslocamento de tempo de animação instanceDelay.

Renderização e composição do CALayer

A renderização do CALayer ocorre em três fases. Commit — quando uma propriedade da camada muda, um lote de alterações é formado na CPU. Render — o Core Animation gera comandos Metal na CPU com base nas propriedades da camada. Composite — a GPU executa os comandos e exibe o quadro na tela. Todo o processo é sincronizado com a taxa de atualização da tela.

Durante a composição de múltiplas camadas, a GPU as mescla na imagem final levando em conta transparência, máscaras e modos de mesclagem. Se uma camada tiver opaque = true, o Core Animation otimiza a composição: em vez de mesclagem alfa, é feita uma simples substituição de pixels, que é significativamente mais rápida.

De acordo com as Apple Performance Guidelines, os principais fatores que retardam a renderização do CALayer são: hierarquia complexa de sublayers (mais de 30 camadas na tela), uso de máscaras (propriedade mask), cálculo automático de sombra sem shadowPath e uso excessivo de shouldRasterize para camadas dinâmicas.

O Core Animation Instrument no XCode permite monitorar o tempo de renderização de cada camada, a quantidade de buffers offscreen e a frequência de chamadas drawRect. O tempo ideal de renderização para 60 FPS não excede 8 ms na CPU e 8 ms na GPU.

Renderização offscreen e seu impacto

Renderização offscreen — renderizar uma camada em um buffer intermediário antes de exibi-la na tela. Ocorre ao usar cornerRadius + masksToBounds com conteúdo, opacidade de grupo, máscaras e shouldRasterize. Cada passagem offscreen leva 2–5 ms, portanto, renderizações offscreen excessivas são críticas para o desempenho.

Para diagnosticar a renderização offscreen, use a ferramenta Color Offscreen-Rendered no Core Animation Instrument. Camadas amarelas — offscreen, azuis — renderização direta na tela. Minimizar as passagens offscreen é uma técnica chave de otimização no iOS.

Exemplos de código: trabalhando com CALayer em Swift

O primeiro exemplo demonstra a configuração básica do CALayer com criação de sombra, arredondamento de cantos e borda. shadowPath é especificado explicitamente para acelerar a renderização:

swift
import UIKit

func configureLayer(_ view: UIView) {
    let layer = view.layer
    layer.cornerRadius = 16
    layer.borderWidth = 2
    layer.borderColor = UIColor.systemBlue.cgColor
    layer.backgroundColor = UIColor.white.cgColor

    layer.shadowColor = UIColor.black.cgColor
    layer.shadowOpacity = 0.2
    layer.shadowOffset = CGSize(width: 0, height: 4)
    layer.shadowRadius = 8
    layer.shadowPath = UIBezierPath(
        roundedRect: view.bounds,
        cornerRadius: layer.cornerRadius
    ).cgPath
}

O segundo exemplo mostra a animação de transform via CABasicAnimation com transformação 3D de perspectiva. A animação de rotação no eixo Y cria um efeito de virar cartão:

swift
let flipAnimation = CABasicAnimation(keyPath: "transform")
var transform = CATransform3DIdentity
transform.m34 = -1.0 / 500.0
transform = CATransform3DRotate(transform, .pi, 0, 1, 0)
flipAnimation.toValue = NSValue(caTransform3D: transform)
flipAnimation.duration = 0.8
flipAnimation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
cardLayer.add(flipAnimation, forKey: "flip")

O terceiro exemplo demonstra o uso de CAGradientLayer para criar um gradiente de fundo. O gradiente renderiza na GPU e não requer recursos adicionais ao redimensionar:

swift
func addGradient(to view: UIView, colors: [UIColor]) {
    let gradient = CAGradientLayer()
    gradient.colors = colors.map { $0.cgColor }
    gradient.locations = [0.0, 0.5, 1.0]
    gradient.startPoint = CGPoint(x: 0.0, y: 0.0)
    gradient.endPoint = CGPoint(x: 1.0, y: 1.0)
    gradient.frame = view.bounds
    view.layer.insertSublayer(gradient, at: 0)
}

Perguntas frequentes

Como o CALayer difere do UIView?

UIView é um invólucro sobre CALayer que adiciona manipulação de toque, Auto Layout e integração com UIViewController. O CALayer trabalha apenas com apresentação visual e animação, tornando-o mais leve e eficiente para tarefas puramente gráficas.

Quais propriedades do CALayer animam sem código adicional?

Mais de 40 propriedades, incluindo position, bounds, frame, opacity, backgroundColor, cornerRadius, transform, shadowOffset, shadowRadius, borderWidth e borderColor. A animação é iniciada automaticamente ao alterar uma propriedade dentro de um bloco de animação UIView.animate.

Como acelerar a renderização de sombra do CALayer?

Defina shadowPath — um contorno de sombra explícito como UIBezierPath. Sem shadowPath, o Core Animation analisa o canal alfa do conteúdo para calcular a forma da sombra, exigindo uma passagem adicional. Com shadowPath, a sombra é renderizada como uma forma geométrica simples sem análise de conteúdo.

O que é animação implícita no CALayer?

Animação implícita é a animação automática ao alterar uma propriedade animável do CALayer fora de um bloco UIView.animate. A duração padrão é de 0,25 segundos. Pode ser desativada via CATransaction.setDisableActions(true) ou ter uma duração personalizada definida via CATransaction.begin/commit.

Quando usar CAShapeLayer em vez de CALayer?

CAShapeLayer é mais eficiente quando você precisa exibir uma forma vetorial — uma linha, círculo, polígono, caminho complexo. Ele renderiza um path na GPU sem criar um buffer raster separado. O CALayer base é adequado para áreas retangulares com fundo, borda e sombra.

Resumo

  • CALayer é a classe base para camadas gráficas no iOS, responsável pela renderização, animação e composição através do Core Animation.
  • Cada UIView contém um CALayer, mas a camada também pode ser usada independentemente para elementos visuais sem manipulação de toque.
  • Propriedades principais: frame, bounds, backgroundColor, cornerRadius, shadowPath, transform, opacity — todas animáveis.
  • Subclasses especializadas: CAShapeLayer, CATextLayer, CAGradientLayer, CAEmitterLayer, CAReplicatorLayer.
  • A renderização passa por três fases: Commit, Render, Composite — todas na GPU via Metal.
  • A renderização offscreen ocorre com máscaras, shouldRasterize e opacidade de grupo — minimize-a para 60 FPS.
  • Um shadowPath explícito acelera a renderização da sombra em 2–3 vezes em comparação com o cálculo automático.

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.

Discutir o projeto

Leia também