Texto Cortado
O texto estático não deve cortar seu conteúdo visível em seu estado atual ou quando for redimensionado.
O Que Procuramos
O conteúdo visível dos elementos de texto estático não deve ser cortado, seja no tamanho de texto padrão ou em tamanhos maiores de Texto Dinâmico.
Exemplo de Falha ❌
Uma restrição de altura fixa impede que os contêineres de texto cresçam para acomodar seu conteúdo
Quando o usuário aumenta o tamanho do Tipo Dinâmico, o texto redimensionado é cortado na borda do contêiner
O texto é cortado sem qualquer reticência, barras de rolagem ou indicação de que este conteúdo pode ser acessado
Exemplo de Sucesso ✅
A altura flexível permite que o contêiner cresça verticalmente à medida que o texto se ajusta em várias linhas
Nenhum conteúdo é cortado em qualquer tamanho de Tipo Dinâmico
Os usuários que dependem de tamanhos de texto maiores podem acessar todas as informações na tela
Em Resumo
- Esta regra tem um impacto sério para os usuários
- Esta regra requer iOS 17.0 ou posterior e funciona em elementos de texto estático que são visíveis e ajustáveis pelo desenvolvedor
- O texto estático não deve cortar seu conteúdo visível em seu estado atual ou quando for redimensionado
- Corrija permitindo que o texto se ajuste ou cresça:
- Defina
numberOfLines = 0(UIKit), ou - Remova
.clipped()/.lineLimit()(SwiftUI)
- Defina
Impacto nos Usuários
Usuários com baixa visão, deficiências cognitivas ou que dependem de tamanhos de texto maiores via Tipo Dinâmico podem não conseguir acessar informações que são cortadas. A WCAG 1.4.4 (Redimensionar Texto) requer que o conteúdo do texto permaneça visível e utilizável quando o usuário aumenta o texto. Esta regra ajuda a identificar conteúdo que já foi cortado, bem como conteúdo que seria cortado se o usuário aumentar sua configuração de tamanho de texto.
Confirme o Problema de Texto Cortado
- Encontre Acessibilidade em Ajustes do iOS Configurações
- Selecione Tela e Tamanho de Texto
- Alterne para selecionar o maior tamanho de texto de acessibilidade no painel Texto Maior
- Observe a mudança na tela:
- Inacessível: O conteúdo é cortado por esta visualização
- Acessível: O conteúdo se ajusta, cresce verticalmente ou pode ser acessado ao rolar
Corrigir Problemas
- Garanta que os contêineres de texto ajustáveis pelo desenvolvedor tenham largura e altura suficientes para exibir o conteúdo completo, inclusive no maior tamanho de Tipo Dinâmico que você pretende suportar
- Use restrições de Auto Layout que permitem que o texto se ajuste ou cresça verticalmente
- Defina a propriedade
numberOfLinesno texto paranumberOfLines = 0 - Para conteúdo rolável, verifique se a própria visualização de rolagem está corretamente dimensionada para que o texto mais longo possa rolar para a visualização em vez de truncar
UIKit
Para resolver este problema no UIKit, normalmente você precisa de uma correção de texto e uma correção de layout juntas. Definir numberOfLines para 0 permite que o rótulo se ajuste, mas uma restrição de altura fixa no rótulo ou em seu contêiner ainda cortará o texto ajustado. Use também greaterThanOrEqualToConstant restrições de altura, para que o contêiner possa realmente crescer.
-
Defina
numberOfLines = 0emUILabelpara permitir ajuste em várias linhas (correção de texto)label.numberOfLines = 0 -
Substitua as restrições de Auto Layout de altura fixa por >= para que o contêiner possa crescer para se ajustar ao texto quebrado
label.heightAnchor.constraint(greaterThanOrEqualToConstant: minHeight).isActive = true
SwiftUI
O sistema de layout do SwiftUI dimensiona automaticamente os elementos para se ajustarem ao seu conteúdo. Evite usar um frame fixo ou a propriedade clipped() . As propriedades .fixedSize e minHeight só são necessárias em casos extremos onde um elemento pai ainda está impondo suas próprias restrições de tamanho ao texto.
-
O uso da propriedade
.clipped()e/ou de quadros de tamanho fixo são as principais causas de violações de texto cortado - remover essas restrições geralmente é tudo o que é necessário// before Text("Long content that needs to wrap") .truncationMode(.tail) .clipped() .frame(width: 50, height: 20) // after Text("Long content that needs to wrap") -
Remova
.lineLimit(1)ou defina como nulo, como uma correção de suporte para permitir que o texto se quebreText("Your text here") .lineLimit(nil) -
Se uma visão pai está restringindo o tamanho do texto, use
.fixedSize(horizontal: false, vertical: true)para permitir que ele se expanda verticalmenteText("Long content that needs to wrap") .fixedSize(horizontal: false, vertical: true) -
Opcionalmente, defina
minHeightno quadro para que ele possa crescer com o conteúdoText("Content").frame(minHeight: minHeight) -
Use
ViewThatFits(iOS 16+) para layouts adaptativos que mudam de arranjo em tamanhos maiores, para evitar cortes antes que ocorramViewThatFits { HStack { Text("Label"); Text("Value") } // compact — fits on one row VStack { Text("Label"); Text("Value") } // falls back to stacked if needed }
React Native
Para evitar esse problema no React Native, assegure-se de que as vistas tenham alturas flexíveis. Você pode usar qualquer uma das seguintes abordagens.
-
Não defina uma altura - o contêiner dimensionará a si mesmo para se ajustar ao seu conteúdo.
<View style={{ padding: 8 }}> <Text>{text}</Text> </View> -
Use a propriedade
minHeightem vez deheight- isso define um limite inferior para conteúdo curto, mas o contêiner pode crescer mais alto quando o texto precisa de mais espaço.<View style={{ minHeight: 30, padding: 8 }}> <Text>{text}</Text> </View> -
Use um layout flexível, para que o contêiner cresça com seu conteúdo e nunca seja esmagado abaixo de seu tamanho natural.
<View style={{ flexGrow: 1, flexShrink: 0, padding: 8 }}> <Text>{text}</Text> </View> -
Use preenchimento em vez de uma altura fixa - o tamanho intrínseco do texto e a quantidade de preenchimento determinarão a altura do contêiner.
<View style={{ padding: 16 }}> <Text>{text}</Text> </View> -
Defina
numberOfLines={0}para que o texto possa se quebrar em qualquer número de linhas, e combine com umlineHeightexplícito para controlar o espaçamento vertical.<View style={{ padding: 8 }}> <Text numberOfLines={0} style={{ lineHeight: 30 }}>{text}</Text> </View>
Flutter
Resolver esse problema no Flutter geralmente requer um ajuste no texto e um ajuste no layout juntos. Text widgets quebram por padrão, mas um pai de altura fixa ou um filho Row não flexível ainda pode cortar o texto quebrado. Permita que os contêineres sejam dimensionados com seu conteúdo e respeite o escalonador de texto do sistema para que o tipo dinâmico possa escalar a fonte.
-
Permita que
Textse quebre em várias linhas deixandomaxLinesnão definido e mantendosoftWrap: true, que é o padrãoText( longString, softWrap: true, ) -
Use preenchimento nos contêineres que envolvem texto para que a caixa cresça com seu conteúdo
Container( padding: const EdgeInsets.all(8), child: Text(longString), ) -
Envolva
TextemExpandedouFlexiblequando ele estiver dentro de umRow, para que ele possa se quebrar em várias linhas conforme a fonte escalaRow( children: [ const Icon(Icons.info), Expanded(child: Text(longString)), ], ) -
Torne a tela rolável para que o texto escalonado permaneça acessível quando crescer além do espaço da tela
SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(16), child: Text(longString), ), )
Posso Ignorar Esta Regra?
Texto Cortado tem um impacto Grave sobre os usuários, e recomendamos corrigir esse problema na maioria dos casos. Texto que é cortado é simplesmente ilegível, e não há uma solução alternativa equivalente para um usuário que depende de tamanhos grandes de Tipo Dinâmico.
Em casos raros, você pode considerar ignorar o resultado se o elemento cortado for decorativo ou redundante - por exemplo, um rótulo curto que é completamente transmitido por outro elemento próximo ou pelo rótulo de acessibilidade de uma imagem. Saiba mais sobre ignorar regras.
Recursos
Páginas de Cursos da Deque University
- 1.4.4a Redimensionar (200%) (Veja iOS Móvel Nativo)
Nota: O acesso completo aos recursos da Deque University requer uma assinatura.
Outros Recursos
- WCAG 2.1 Documentos Explicativos
- Relaciona-se com Compreendendo o SC 1.4.4 - Redimensionar Texto
