Accessibilidade em Swift: tornando aplicativos iOS acessíveis para todos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que a Acessibilidade não é apenas uma caixa de seleção, mas um superpoder do seu aplicativo

\n\n

Imagine: você criou um aplicativo incrível. Interface bonita, animação rápida, código perfeito em Swift. Você se orgulha dele. Mas de repente descobre que 15% dos usuários não conseguem usá-lo. Para eles, os botões são muito pequenos, o texto se mistura com o fundo e o VoiceOver "lê" uma bagunça em vez do menu. Familiar?

\n\n

Acessibilidade não é sobre "obrigação" nem sobre "fazer só para marcar a caixinha". É sobre inclusão, sobre cuidado e, o que é importante, sobre negócios. No iOS, existe um framework poderoso que permite adaptar o aplicativo às necessidades de pessoas com deficiências visuais, auditivas, motoras e cognitivas. E o Swift nos dá todas as ferramentas para fazer isso de forma elegante.

\n\n

Neste artigo, não vamos dar palestras chatas. Vamos analisar exemplos de código específicos que podem ser implementados imediatamente no projeto. Vamos lá!

\n\n

VoiceOver: como "ensinar" o aplicativo a falar sobre si mesmo

\n\n

VoiceOver é o leitor de tela integrado ao iOS. Ele "narra" tudo o que acontece na tela: texto, botões, gestos. Mas se o desenvolvedor não preparar a interface, o VoiceOver pode se tornar um caos. Vamos corrigir isso.

\n\n

Configuração básica: accessibilityLabel e accessibilityTraits

\n\n

A maneira mais simples de ajudar o VoiceOver é definir rótulos e tipos de elementos. Por exemplo, você tem um botão com um ícone de coração. Sem o rótulo, o VoiceOver dirá apenas "botão", mas com o rótulo, dirá "Adicionar aos favoritos".

\n\n
let favoriteButton = UIButton(type: .system)\nfavoriteButton.setImage(UIImage(systemName: "heart"), for: .normal)\nfavoriteButton.accessibilityLabel = "Adicionar aos favoritos"\nfavoriteButton.accessibilityTraits = .button
\n\n

Observe o accessibilityTraits. Isso é uma dica para o VoiceOver sobre como interagir com o elemento. Para botão — .button, para imagem — .image, para título — .header. Use .selected, .notEnabled e outros para transmitir o estado com precisão.

\n\n

Agrupamento de elementos: como evitar que o VoiceOver "enjoe" o usuário

\n\n

Às vezes, faz sentido agrupar vários elementos em um único bloco de significado. Por exemplo, um cartão de produto: imagem, nome, preço. Se o VoiceOver ler cada um separadamente, o usuário se cansará. A solução é UIAccessibilityElement ou shouldGroupAccessibilityChildren.

\n\n
cardView.shouldGroupAccessibilityChildren = true\ncardView.accessibilityLabel = "Tênis Nike Air, 12.990 rublos"\ncardView.accessibilityTraits = .button
\n\n

Agora o VoiceOver lerá o cartão inteiro como um único elemento. Breve, conciso, claro.

\n\n

Ações personalizadas: quando é necessário mais do que apenas um "toque"

\n\n

Existem elementos complexos: controles deslizantes, interruptores, listas de deslizar. Para eles, é importante adicionar ações personalizadas. Por exemplo, para uma célula com as funções "Excluir" e "Editar":

\n\n
let deleteAction = UIAccessibilityCustomAction(\n    name: "Excluir",\n    target: self,\n    selector: #selector(deleteItem)\n)\nlet editAction = UIAccessibilityCustomAction(\n    name: "Editar",\n    target: self,\n    selector: #selector(editItem)\n)\ncell.accessibilityCustomActions = [deleteAction, editAction]
\n\n

O usuário do VoiceOver desliza para baixo ou para cima para selecionar uma ação. Isso melhora significativamente a experiência.

\n\n

Dynamic Type: texto que se adapta a cada um

\n\n

Pessoas com visão reduzida frequentemente aumentam a fonte nas configurações do iOS. Se o seu aplicativo não suporta Dynamic Type, o texto será cortado, sobreposto ou simplesmente se tornará ilegível. Como evitar isso?

\n\n

Usando estilos de fonte dinâmicos

\n\n

Em vez de usar UIFont.systemFont(ofSize: 16) fixo, use UIFont.preferredFont(forTextStyle: .body).

\n\n
label.font = UIFont.preferredFont(forText                

Blogs

Book Recommendations