VoiceOver é um leitor de tela integrado da Apple que vocaliza cada elemento da interface e permite controlar o dispositivo por meio de gestos. A tecnologia está integrada ao iOS, iPadOS e macOS em nível de sistema e não requer instalação de software adicional. De acordo com Apple Accessibility (2025), o VoiceOver suporta mais de 40 idiomas e é usado por milhões de usuários cegos e com deficiência visual em todo o mundo.
Principais pontos
VoiceOver é um leitor de tela integrado aos sistemas operacionais da Apple. Ele é projetado para usuários cegos e com deficiência visual e proporciona interação completa com o dispositivo sem contato visual. O VoiceOver vocaliza todos os elementos da interface: botões, links, texto, imagens, notificações e elementos do sistema.
A tecnologia foi apresentada pela primeira vez em 2005 para macOS e apareceu no iOS com o iPhone 3GS em 2009. Desde então, o VoiceOver tornou-se parte integrante do ecossistema Apple e um dos principais argumentos a favor da acessibilidade da plataforma. O VoiceOver está integrado em nível de sistema — o que significa que funciona em qualquer aplicativo sem integração adicional por parte do desenvolvedor, embora a qualidade da vocalização dependa diretamente de quão bem o aplicativo usa a API de Acessibilidade do iOS.
O VoiceOver suporta mais de 40 idiomas com síntese de fala natural e se adapta às configurações regionais de voz. No iOS, o VoiceOver usa os motores de voz da Siri para português e vários outros idiomas, garantindo o som mais natural e a entonação correta dependendo da pontuação e do contexto.
O VoiceOver intercepta eventos de toque e os interpreta de maneira diferente da entrada padrão do iOS. Quando um usuário toca na tela, o VoiceOver não ativa o elemento sob o dedo, mas primeiro o vocaliza. Somente após um toque duplo o elemento é ativado. Essa diferença fundamental permite que usuários cegos explorem a interface sem risco de cliques acidentais.
O VoiceOver lê os elementos da interface em ordem lógica: da esquerda para a direita, de cima para baixo. A ordem de leitura é herdada da hierarquia de visualizações do iOS, mas o desenvolvedor pode alterá-la através da propriedade accessibilityElements para layouts complexos. O usuário pode navegar entre os elementos deslizando para a direita (próximo) e para a esquerda (anterior), bem como tocar em um elemento específico para que seja vocalizado.
A cada movimento, o VoiceOver pronuncia o tipo do elemento (botão, link, título), seu nome (accessibilityLabel), estado (selecionado, desabilitado) e dica (accessibilityHint). Se o elemento contém um valor — por exemplo, um controle deslizante de volume — o VoiceOver também o vocaliza. Os Accessibility Traits (UIAccessibilityTraits) informam adicionalmente o usuário sobre o comportamento do elemento: se é um botão, interruptor, campo de busca ou tecla de teclado.
O Rotor é um dial de ajuste virtual que alterna o modo de navegação do VoiceOver. O usuário gira o rotor com dois dedos (como um botão de volume) e seleciona um modo: palavras, caracteres, títulos, links, pontos de entrada, linhas de tabela e outros. O modo de títulos permite alternar rapidamente entre H1-H6 em páginas web e aplicativos, enquanto o modo de caracteres fala o texto letra por letra, útil ao preencher formulários ou inserir códigos de verificação.
O desenvolvedor pode adicionar modos personalizados ao rotor através da API UIAccessibilityCustomRotor. Por exemplo, em um aplicativo de notas, pode-se adicionar um rotor de “Notas favoritas” ou “Alterações recentes”. Rotores personalizados aceleram significativamente a navegação em aplicativos específicos e são considerados melhores práticas de acessibilidade no iOS.
O VoiceOver usa seu próprio conjunto de gestos que não correspondem aos gestos padrão do iOS. A maioria dos gestos é realizada com três dedos em vez de um — isso evita conflitos com a operação normal e permite que o VoiceOver funcione simultaneamente com a entrada padrão.
| Ação | Gesto | Resultado |
|---|---|---|
| Vocalizar elemento | Toque com 1 dedo | Fala o nome do elemento |
| Ativar | Toque duplo | Pressiona botão ou link |
| Próximo elemento | Deslizar para direita | Ir para o próximo |
| Elemento anterior | Deslizar para esquerda | Voltar ao anterior |
| Rolar | Deslizar com 3 dedos | Rolar lista ou página |
| Rotor | Girar com 2 dedos | Alterar modo de navegação |
O gesto de toque duplo é a principal forma de ativar elementos no VoiceOver. Se um elemento requer uma ação especial (por exemplo, arrastar), o VoiceOver usa a sequência “toque — toque duplo e segurar” para entrar no modo de movimento. Isso permite realizar gestos complexos como arrastar e soltar sem ver a tela. O VoiceOver também suporta o gesto de “toque duplo com dois dedos” para cancelar uma ação e “toque triplo” para ativar/desativar a Cortina de tela (Screen Curtain).
Um desenvolvedor de aplicativos iOS pode melhorar significativamente a interação com o VoiceOver através da API UIAccessibility. As configurações básicas de acessibilidade são adicionadas no Interface Builder (Identity Inspector → Accessibility), mas interfaces complexas exigem configuração programática em código.
A propriedade accessibilityLabel define o texto que o VoiceOver fala para o elemento. Se nenhum rótulo for definido, o VoiceOver usa o texto do botão ou o espaço reservado do campo de texto. Para elementos sem texto (ícones, visualizações personalizadas), o rótulo é obrigatório. A propriedade accessibilityTraits define o tipo do elemento: botão, título, interruptor, campo de busca, tecla de teclado, valor altera, link e outros.
let profileButton = UIButton(type: .custom)
profileButton.setImage(UIImage(named: "avatar"), for: .normal)
profileButton.isAccessibilityElement = true
profileButton.accessibilityLabel = "Perfil do usuário"
profileButton.accessibilityTraits = .button
profileButton.accessibilityHint = "Abre a tela de configurações do perfil"
A flag isAccessibilityElement habilita o suporte ao VoiceOver para visualizações personalizadas — por padrão, é verdadeiro apenas para elementos padrão (UIButton, UILabel, UITextField). O parâmetro accessibilityHint adiciona uma dica: o VoiceOver a pronuncia após uma pausa se o usuário parar em um elemento. A dica deve descrever o resultado da ação, não a instrução: “Abre a tela de configurações” em vez de “Pressione para abrir”.
Para telas complexas onde o grupo lógico de elementos não corresponde à ordem visual, usa-se accessibilityElements — um array que define a ordem de leitura. Por exemplo, um cartão de produto contém uma imagem, nome, preço e um botão “Adicionar ao carrinho”. Se esses elementos estão dispostos caoticamente na hierarquia de visualizações, o accessibilityElements estabelece a ordem correta para o VoiceOver.
let productCard = UIView()
let productImage = UIImageView()
let productName = UILabel()
let productPrice = UILabel()
let addToCartButton = UIButton()
productCard.accessibilityElements = [
productImage, productName, productPrice, addToCartButton
]
Para combinar vários elementos em um único elemento acessível, usa-se UIAccessibilityContainer ou accessibilityFrame para substituir a área de toque. Isso é útil quando uma célula de tabela contém vários componentes de UI mas representa logicamente um único elemento — o VoiceOver deve vocalizar a célula inteira como um todo, não iterar por seu conteúdo individualmente.
A configuração correta de acessibilidade para o VoiceOver requer atenção a vários aspectos: marcação semântica, atualizações dinâmicas, manipulação de elementos personalizados e testes com um leitor de tela real.
No SwiftUI, a acessibilidade é configurada através dos modificadores .accessibilityLabel(), .accessibilityValue(), .accessibilityHint() e .accessibilityAddTraits(). O SwiftUI herda automaticamente a acessibilidade dos elementos padrão, mas componentes personalizados exigem configuração explícita. Por exemplo, um controle deslizante personalizado deve informar seu valor e formato de alteração ao VoiceOver.
Slider(value: $volume, in: 0...100)
.accessibilityLabel("Volume do som")
.accessibilityValue(
Text("\(Int(volume)) por cento")
)
.accessibilityAddTraits(.adjustsAudioForAccessibility)
.accessibilityAdjustableAction { direction in
switch direction {
case .increment: volume = min(volume + 5, 100)
case .decrement: volume = max(volume - 5, 0)
}
}
O modificador accessibilityAdjustableAction adiciona a capacidade de alterar valores com gestos do VoiceOver: deslizar para cima para aumentar, deslizar para baixo para diminuir. Sem este modificador, o controle deslizante permanecerá inacessível para controle pelo leitor de tela. Configuração semelhante é necessária para steppers personalizados, seletores e outros elementos que alteram seu valor.
Quando o conteúdo na tela muda dinamicamente (uma notificação aparece, o status de carregamento é atualizado, um preço muda), o VoiceOver deve receber uma notificação através de UIAccessibility.post. Sem esta chamada, o leitor de tela não saberá sobre as alterações e o usuário perderá informações importantes. Para SwiftUI, usa-se o modificador .accessibilityAnnouncement().
UIAccessibility.post(
notification: .announcement,
argument: "Preço reduzido em 20 por cento"
)
// SwiftUI
Text("Preço atualizado")
.accessibilityAnnouncement(Text("20% de desconto"))
As notificações do VoiceOver devem ser usadas de forma criteriosa: anúncios excessivos irritam o usuário, enquanto sua ausência torna o aplicativo inacessível. A estratégia ideal é anunciar apenas as alterações que afetam o fluxo de trabalho atual do usuário: atualizações do carrinho, status de carregamento, erro de validação de formulário, notificação de chat. Alterações em segundo plano (hora no painel, taxas de câmbio) não requerem anúncio — o usuário as verificará quando necessário.
O teste do VoiceOver é realizado usando um dispositivo físico com o leitor de tela ativado ou um simulador iOS com a opção Accessibility Inspector. É importante testar cenários de uso completo: completar um registro, fazer um pedido, encontrar um produto por busca sem controle visual. Se o fluxo é navegável sem feedback visual — o VoiceOver está configurado corretamente.
Perguntas frequentes
Ajustes → Acessibilidade → VoiceOver. Ative o interruptor. Para ativação rápida, use o clique triplo do botão lateral (no iPhone X e posteriores) ou do botão Início. Siri também pode ativar o VoiceOver com o comando “Ative o VoiceOver”.
VoiceOver é o leitor de tela da Apple para iOS, TalkBack é o leitor de tela do Google para Android. O princípio de funcionamento é o mesmo: tocar vocaliza, toque duplo ativa. A diferença está nos gestos, configurações do rotor e integrações de ecossistema: o VoiceOver é mais profundamente integrado com iCloud e Apple Pay.
Use a API UIAccessibility: defina accessibilityLabel para todos os elementos, accessibilityTraits para o tipo do elemento e accessibilityHint para dicas. No SwiftUI, use os modificadores .accessibilityLabel() e .accessibilityAddTraits(). Teste o aplicativo com o VoiceOver ativado.
O Rotor é um modo de navegação alterado girando dois dedos. Ele determina como navegar entre os elementos: por títulos, caracteres, palavras, links ou pontos de entrada. Desenvolvedores podem adicionar seus próprios modos através do UIAccessibilityCustomRotor.
Para UIView personalizado, é necessário definir isAccessibilityElement = true e fornecer accessibilityLabel. Se o elemento consiste em várias visualizações filhas, use accessibilityElements para definir a ordem de leitura ou combine-os em um contêiner.
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