Por que a Acessibilidade não é apenas uma caixa de seleção, mas um superpoder do seu aplicativo
\n\nImagine: 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\nAcessibilidade 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\nNeste 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\nVoiceOver: como "ensinar" o aplicativo a falar sobre si mesmo
\n\nVoiceOver é 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\nConfiguração básica: accessibilityLabel e accessibilityTraits
\n\nA 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\nlet favoriteButton = UIButton(type: .system)\nfavoriteButton.setImage(UIImage(systemName: "heart"), for: .normal)\nfavoriteButton.accessibilityLabel = "Adicionar aos favoritos"\nfavoriteButton.accessibilityTraits = .button\n\nObserve 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.
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.
cardView.shouldGroupAccessibilityChildren = true\ncardView.accessibilityLabel = "Tênis Nike Air, 12.990 rublos"\ncardView.accessibilityTraits = .button\n\nAgora o VoiceOver lerá o cartão inteiro como um único elemento. Breve, conciso, claro.
\n\nAções personalizadas: quando é necessário mais do que apenas um "toque"
\n\nExistem 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\nlet 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\nO usuário do VoiceOver desliza para baixo ou para cima para selecionar uma ação. Isso melhora significativamente a experiência.
\n\nDynamic Type: texto que se adapta a cada um
\n\nPessoas 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\nUsando estilos de fonte dinâmicos
\n\nEm vez de usar UIFont.systemFont(ofSize: 16) fixo, use UIFont.preferredFont(forTextStyle: .body).
label.font = UIFont.preferredFont(forText