Esta resposta foi atualizada para o Swift 4.2.
Referência rápida
A forma geral de criar e definir uma sequência atribuída é assim. Você pode encontrar outras opções comuns abaixo.
// create attributed string
let myString = "Swift Attributed String"
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttrString = NSAttributedString(string: myString, attributes: myAttribute)
// set attributed text on a UILabel
myLabel.attributedText = myAttrString
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myAttribute = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue ]
let myShadow = NSShadow()
myShadow.shadowBlurRadius = 3
myShadow.shadowOffset = CGSize(width: 3, height: 3)
myShadow.shadowColor = UIColor.gray
let myAttribute = [ NSAttributedString.Key.shadow: myShadow ]
O restante deste post fornece mais detalhes para aqueles que estão interessados.
Atributos
Os atributos de sequência são apenas um dicionário na forma de [NSAttributedString.Key: Any]
, onde NSAttributedString.Key
é o nome da chave do atributo e Any
é o valor de algum Tipo. O valor pode ser uma fonte, uma cor, um número inteiro ou outra coisa. Existem muitos atributos padrão no Swift que já foram predefinidos. Por exemplo:
- nome da chave:,
NSAttributedString.Key.font
valor: aUIFont
- nome da chave:,
NSAttributedString.Key.foregroundColor
valor: aUIColor
- nome da chave:,
NSAttributedString.Key.link
valor: um NSURL
ouNSString
Existem muitos outros. Veja este link para mais informações. Você pode até criar seus próprios atributos personalizados, como:
nome da chave:, NSAttributedString.Key.myName
value: some Type.
se você fizer uma extensão :
extension NSAttributedString.Key {
static let myName = NSAttributedString.Key(rawValue: "myCustomAttributeKey")
}
Criando atributos no Swift
Você pode declarar atributos como declarar qualquer outro dicionário.
// single attributes declared one at a time
let singleAttribute1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let singleAttribute2 = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let singleAttribute3 = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]
// multiple attributes declared at once
let multipleAttributes: [NSAttributedString.Key : Any] = [
NSAttributedString.Key.foregroundColor: UIColor.green,
NSAttributedString.Key.backgroundColor: UIColor.yellow,
NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]
// custom attribute
let customAttribute = [ NSAttributedString.Key.myName: "Some value" ]
Observe o rawValue
que era necessário para o valor do estilo de sublinhado.
Como os atributos são apenas dicionários, você também pode criá-los criando um dicionário vazio e adicionando pares de valores-chave a ele. Se o valor contiver vários tipos, você precisará usar Any
como o tipo. Aqui está o multipleAttributes
exemplo acima, recriado desta maneira:
var multipleAttributes = [NSAttributedString.Key : Any]()
multipleAttributes[NSAttributedString.Key.foregroundColor] = UIColor.green
multipleAttributes[NSAttributedString.Key.backgroundColor] = UIColor.yellow
multipleAttributes[NSAttributedString.Key.underlineStyle] = NSUnderlineStyle.double.rawValue
Strings atribuídas
Agora que você entende os atributos, pode criar cadeias atribuídas.
Inicialização
Existem algumas maneiras de criar cadeias atribuídas. Se você só precisa de uma string somente leitura, pode usar NSAttributedString
. Aqui estão algumas maneiras de inicializá-lo:
// Initialize with a string only
let attrString1 = NSAttributedString(string: "Hello.")
// Initialize with a string and inline attribute(s)
let attrString2 = NSAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])
// Initialize with a string and separately declared attribute(s)
let myAttributes1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let attrString3 = NSAttributedString(string: "Hello.", attributes: myAttributes1)
Se você precisar alterar os atributos ou o conteúdo da sequência posteriormente, use NSMutableAttributedString
. As declarações são muito semelhantes:
// Create a blank attributed string
let mutableAttrString1 = NSMutableAttributedString()
// Initialize with a string only
let mutableAttrString2 = NSMutableAttributedString(string: "Hello.")
// Initialize with a string and inline attribute(s)
let mutableAttrString3 = NSMutableAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])
// Initialize with a string and separately declared attribute(s)
let myAttributes2 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let mutableAttrString4 = NSMutableAttributedString(string: "Hello.", attributes: myAttributes2)
Alterando uma sequência atribuída
Como exemplo, vamos criar a sequência atribuída na parte superior desta postagem.
Primeiro, crie um NSMutableAttributedString
com um novo atributo de fonte.
let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myString = NSMutableAttributedString(string: "Swift", attributes: myAttribute )
Se você estiver trabalhando junto, defina a sequência atribuída como UITextView
(ou UILabel
) assim:
textView.attributedText = myString
Você não usa textView.text
.
Aqui está o resultado:
Em seguida, acrescente outra string atribuída que não tenha nenhum atributo definido. (Observe que, embora eu tenha let
declarado myString
acima, ainda posso modificá-lo porque é um NSMutableAttributedString
. Isso me parece um pouco inconstante e não ficaria surpreso se isso mudar no futuro. Deixe-me um comentário quando isso acontecer.)
let attrString = NSAttributedString(string: " Attributed Strings")
myString.append(attrString)
Em seguida, basta selecionar a palavra "Strings", que começa no índice 17
e tem um comprimento de 7
. Observe que este é um NSRange
e não um Swift Range
. (Consulte esta resposta para obter mais informações sobre intervalos.) O addAttribute
método permite colocar o nome da chave do atributo no primeiro ponto, o valor do atributo no segundo ponto e o intervalo no terceiro ponto.
var myRange = NSRange(location: 17, length: 7) // range starting at location 17 with a lenth of 7: "Strings"
myString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red, range: myRange)
Finalmente, vamos adicionar uma cor de fundo. Para variedade, vamos usar o addAttributes
método (observe o s
). Eu poderia adicionar vários atributos de uma vez com esse método, mas adicionarei apenas um novamente.
myRange = NSRange(location: 3, length: 17)
let anotherAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
myString.addAttributes(anotherAttribute, range: myRange)
Observe que os atributos estão sobrepostos em alguns lugares. Adicionar um atributo não substitui um atributo que já está lá.
Relacionado
Leitura adicional
NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue | NSUnderlineStyle.PatternDot.rawValue