Attributed Text é um mecanismo do iOS SDK, representado pelas classes NSAttributedString e NSMutableAttributedString, que permite aplicar múltiplos estilos a diferentes partes de uma mesma string de texto. Ao contrário de um NSString comum, Attributed String armazena não apenas caracteres, mas também um dicionário de atributos para cada intervalo: fonte, cor, espaçamento entre linhas, sombra e alinhamento. De acordo com a Documentação para Desenvolvedores da Apple, Attributed String é a base para exibir texto formatado em UILabel, UITextView e UITextField. É a forma padrão de estilizar texto sem WebKit ou bibliotecas de terceiros.
Principais Pontos
NSAttributedString é uma classe do framework Foundation que representa uma string com um conjunto de atributos nomeados vinculados a intervalos de caracteres. Cada atributo é um par chave-valor: a chave é definida por uma constante (NSFontAttributeName, NSForegroundColorAttributeName), e o valor é o objeto correspondente (UIFont, UIColor). Os atributos são aplicados a um intervalo de caracteres via NSRange.
A classe está disponível em todas as plataformas Apple: iOS (2.0+), macOS, tvOS, watchOS. NSAttributedString é imutável — uma vez criado, seus atributos são fixos. Para alterações dinâmicas, utiliza-se NSMutableAttributedString, que herda de NSAttributedString e adiciona os métodos setAttributes, addAttributes, addAttribute, removeAttribute.
NSString é uma string simples de caracteres sem informação de estilo. Qualquer texto passado para UILabel via text é exibido com uma única fonte, cor e tamanho. NSAttributedString, passado via attributedText, permite que cada caractere tenha seu próprio conjunto de atributos. UILabel, UITextView e UITextField reconhecem automaticamente NSAttributedString e renderizam o texto de acordo com seus atributos.
Internamente, NSAttributedString armazena um NSString com o texto e um array de intervalos de atributos. Cada intervalo é representado por uma estrutura NSRange e um dicionário de atributos. Durante a renderização, o sistema percorre os intervalos e aplica os atributos correspondentes a cada seção. A eficiência depende do número de trocas de atributos — mudanças frequentes em seções curtas aumentam o tempo de renderização.
Os atributos do NSAttributedString são constantes definidas em UIKit (iOS) e AppKit (macOS), cada uma correspondendo a um aspecto específico da estilização visual do texto. Todos os atributos são strings NSAttributedString.Key, e seus valores são objetos de classes específicas. Os atributos são divididos em nível de caractere (afetam caracteres) e nível de parágrafo (afetam parágrafos).
Atributos de nível de caractere incluem fonte (NSFontAttributeName), cor do texto (NSForegroundColorAttributeName), cor de fundo (NSBackgroundColorAttributeName), sublinhado (NSUnderlineStyleAttributeName), tachado (NSStrikethroughStyleAttributeName), sombra (NSShadowAttributeName). Atributos de nível de parágrafo são definidos via NSParagraphStyleAttributeName, que controla alinhamento, recuo, espaçamento entre linhas e tabulação.
NSLinkAttributeName cria um link clicável no texto: o valor é uma URL ou string. UITextView lida automaticamente com esses links se a interação estiver habilitada. NSAttachmentAttributeName permite incorporar um NSTextAttachment — uma imagem dentro do texto que é renderizada como elemento inline. Isso é usado para criar texto com ícones, emojis ou visualizações personalizadas dentro de uma string.
Cada atributo de NSAttributedString tem um valor estritamente tipado. Vamos ver os atributos mais usados no desenvolvimento iOS. A fonte é definida através de um objeto UIFont, a cor através de UIColor, o espaçamento entre linhas através de NSMutableParagraphStyle, que permite configurar alinhamento, recuo e espaçamento em um único objeto.
| Chave do Atributo | Tipo do Valor | Propósito |
|---|---|---|
| NSFontAttributeName | UIFont | Fonte do texto |
| NSForegroundColorAttributeName | UIColor | Cor do texto |
| NSBackgroundColorAttributeName | UIColor | Cor de fundo atrás do texto |
| NSUnderlineStyleAttributeName | NSNumber (Int) | Estilo do sublinhado |
| NSParagraphStyleAttributeName | NSParagraphStyle | Configurações de parágrafo |
| NSKernAttributeName | NSNumber (Float) | Espaçamento entre letras (kerning) |
NSParagraphStyle é um contêiner para atributos de parágrafo: alignment, lineSpacing, paragraphSpacing, firstLineHeadIndent, lineBreakMode, minimumLineHeight e outros. Para modificar esses parâmetros, cria-se um NSMutableParagraphStyle, configuram-se as propriedades desejadas e o objeto é passado como valor do atributo NSParagraphStyleAttributeName. Esta é a única forma de controlar o espaçamento entre linhas no NSAttributedString.
NSShadow permite adicionar uma sombra ao texto: os parâmetros shadowOffset, shadowBlurRadius, shadowColor definem o deslocamento, desfoque e cor da sombra. Atributos de sublinhado e tachado aceitam combinações de estilos: NSUnderlineStyle.single, .double, .thick, .patternDash, .patternDot. Para controle preciso da espessura e cor das linhas, utiliza-se NSUnderlineColorAttributeName e NSStrikethroughColorAttributeName.
A criação de um NSAttributedString em Swift é feita através de um inicializador com o texto e um dicionário de atributos, ou através de NSMutableAttributedString com aplicação passo a passo de estilos. A abordagem básica é definir um dicionário de atributos para todo o texto, depois adicionar ou modificar atributos para intervalos específicos.
Um exemplo simples — definir fonte, cor e alinhamento para toda a string. O dicionário de atributos é passado ao inicializador do NSAttributedString. As chaves do dicionário são constantes NSAttributedString.Key, os valores são objetos UIKit correspondentes. Este é o caso básico quando todo o texto é formatado uniformemente.
let attributes: [NSAttributedString.Key: Any] = [
.font: UIFont.systemFont(ofSize: 16),
.foregroundColor: UIColor.darkGray,
.paragraphStyle: let style = NSMutableParagraphStyle()
style.alignment = .center
style.lineSpacing = 4
return style
]
let attributedString = NSAttributedString(
string: "Hello world",
attributes: attributes
)
label.attributedText = attributedString
O texto será exibido com systemFont 16, cor cinza escuro, alinhamento centralizado e espaçamento entre linhas de 4pt. Esta abordagem é conveniente para cabeçalhos e botões estáticos.
NSMutableAttributedString permite aplicar diferentes estilos a diferentes partes do texto. O método addAttribute adiciona um único atributo a um intervalo, addAttributes adiciona um dicionário de atributos. O método setAttributes substitui todos os atributos existentes de um intervalo por novos. Esta é a principal ferramenta para criar texto com destaque.
let text = "Price: 1999 rubles"
let attributed = NSMutableAttributedString(string: text)
attributed.addAttribute(.foregroundColor,
value: UIColor.green, range: NSRange(location: 6, length: 4))
attributed.addAttribute(.font,
value: UIFont.boldSystemFont(ofSize: 20), range: NSRange(location: 6, length: 4))
label.attributedText = attributed
A palavra “1999” será verde e em negrito, o restante do texto será padrão. NSRange é calculado manualmente — é importante contar corretamente o comprimento em caracteres, especialmente ao trabalhar com emojis e caracteres Unicode compostos.
NSMutableAttributedString fornece métodos para alterar dinamicamente texto e atributos: append, insert, replace, delete, setAttributes, addAttribute, removeAttribute, enumerateAttributes. Isso permite construir texto a partir de diferentes fontes, combinar estilos e responder a eventos da interface.
Ao contrário do NSAttributedString imutável, a versão mutável suporta alteração de conteúdo sem criar um novo objeto. Isso é crítico para editores de texto, chats e formulários onde o usuário pode editar o texto enquanto os estilos devem ser preservados.
Em mensageiros, cada mensagem contém o nome do usuário (negrito), o texto da mensagem (normal), a hora (cor cinza). NSMutableAttributedString permite construir essa string de uma só vez, adicionando partes na ordem desejada com os atributos correspondentes.
let result = NSMutableAttributedString()
let name = NSAttributedString(string: "Anna: ",
attributes: [.font: UIFont.boldSystemFont(ofSize: 15)])
let message = NSAttributedString(string: "Hello, how are you?",
attributes: [.font: UIFont.systemFont(ofSize: 15)])
let time = NSAttributedString(string: " 12:30",
attributes: [.foregroundColor: UIColor.gray])
result.append(name)
result.append(message)
result.append(time)
label.attributedText = result
O resultado é uma única string com três seções estilizadas. Append calcula NSRange automaticamente, as posições não precisam ser calculadas manualmente. Esta abordagem escala para qualquer número de fragmentos.
O método enumerateAttributes(in:options:using:) percorre todos os intervalos de atributos no intervalo especificado. Isso é útil para análise de formatação: encontrar todos os links, alterar a cor de atributos específicos ou exportar texto para HTML. No closure, são recebidos o dicionário de atributos e o NSRange da seção atual.
Todos os principais componentes de UI para exibir texto no UIKit suportam NSAttributedString através da propriedade attributedText. UILabel exibe texto estilizado estático, UITextView suporta edição e links, UITextField aceita atributos para o placeholder e o texto inserido separadamente.
UILabel é o componente mais leve para exibir texto estilizado. Ele suporta todos os atributos de nível de caractere, mas não lida com links clicáveis automaticamente (para isso, é necessário UITextView). UILabel é ideal para cabeçalhos, rótulos e textos curtos formatados.
UITextView lida com NSLinkAttributeName e exibe links como elementos interativos. Para habilitar essa funcionalidade, defina isSelectable = true e isEditable = false. Ao tocar em um link, o delegado recebe a chamada textView(_:shouldInteractWith:in:interaction:). UITextView também suporta NSTextAttachment para imagens dentro do texto.
let text = "Details on developer.apple.com"
let attributed = NSMutableAttributedString(string: text)
attributed.addAttribute(.link,
value: URL(string: "https://developer.apple.com")!,
range: NSRange(location: 0, length: text.count))
textView.attributedText = attributed
textView.isSelectable = true
textView.isEditable = false
Após configurar isSelectable e isEditable, a área de texto se comporta como um bloco de texto estático, mas os links permanecem ativos. UITextViewDelegate controla o comportamento ao tocar.
Core Text é um framework de baixo nível da Apple para renderização de texto que trabalha diretamente com NSAttributedString. Ao contrário do UIKit, Core Text não usa NSAttributedString diretamente como objeto de exibição — em vez disso, converte-o em CTFramesetter, depois CTFrame e renderiza em um contexto Core Graphics. Isso dá controle total sobre o layout de linhas e glifos.
O uso de Core Text é justificado para layouts de texto personalizados: colunas, ajuste de imagens, rotação de texto, quebras de linha não padronizadas. O NSMutableParagraphStyle do Core Text inclui atributos não disponíveis no UIKit: kCTParagraphStyleSpecifierMaximumLineSpacing, kCTParagraphStyleSpecifierLineBreakMode com modos adicionais.
NSAttributedString transfere-se perfeitamente entre UIKit e Core Text, já que ambos os frameworks trabalham com o mesmo tipo. Atributos do UIKit (NSFontAttributeName, NSForegroundColorAttributeName) são automaticamente reconhecidos pelo Core Text, e vice-versa — atributos do Core Text (kCTFontAttributeName) são lidos pelo UIKit. Isso permite usar UIKit para tarefas simples e Core Text para renderização personalizada no mesmo objeto NSAttributedString.
Perguntas Frequentes
NSString armazena apenas texto sem informação de estilo. NSAttributedString complementa o texto com um dicionário de atributos para cada intervalo de caracteres. Quando passado para UILabel via propriedade text, NSString é exibido como texto simples. Quando NSAttributedString é passado via attributedText, todos os atributos são aplicados: diferentes fontes, cores e espaçamentos em uma única string.
Use o método addAttributes(_:range:) com um dicionário de atributos: addAttributes([.font: font, .foregroundColor: color], range: range). Para adicionar ou alterar um único atributo, use addAttribute(_:value:range:). O método setAttributes substitui todos os atributos existentes no intervalo pelos fornecidos.
Crie um NSMutableParagraphStyle, defina a propriedade lineSpacing, depois passe-o como valor do atributo NSParagraphStyleAttributeName. Para controle total, também estão disponíveis minimumLineHeight, maximumLineHeight, paragraphSpacing, lineBreakMode e alignment. ParagraphStyle é a única forma de controlar o espaçamento entre linhas.
Sim, SwiftUI suporta NSAttributedString através de Text(attributedString:) no iOS 15+. Em versões mais antigas, use UIViewRepresentable com UILabel ou UITextView. SwiftUI também fornece seu próprio tipo AttributedString (SwiftUI, não Foundation) para formatação declarativa com sintaxe semelhante ao Markdown.
Use o método boundingRect(with:options:context:), que retorna o CGRect necessário para exibir a string com os atributos fornecidos. O parâmetro options: [.usesLineFragmentOrigin, .usesFontLeading] considera o espaçamento entre linhas e as métricas da fonte. Para UILabel com número limitado de linhas, use sizeThatFits.
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