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
textView.atrributedtText = myString
oumyLabel.attributedText = myString
no início de sua resposta. Como novato, eu estava apenas começandomyLabel.text
e não achava que precisava passar por todas as suas respostas. ** 3) ** Isso significa que você só pode ter umaattributedText
outext
ter as duas coisas sem sentido? 4) Eu recomendo que você também incorporelineSpacing
exemplos como este em sua resposta, pois é muito útil. 5) ачаар дахинappendAttributedString
é como 'Concatenação de strings'.addAttribute
está adicionando um novo atributo à sua string.addAttribute
é um método deNSMutableAttributedString
. Você está certo que não pode usá-lo comString
ouNSAttributedString
. (Verifique amyString
definição da alteração de uma Cadeia Atribuído . Seção deste post eu acho que você jogou fora, porque eu também utilizadomyString
para o nome da variável na primeira parte do post onde ele era umNSAttributedString
.)Swift usa o mesmo
NSMutableAttributedString
que Obj-C. Você o instancia, passando o valor calculado como uma sequência:Agora crie a
g
sequência atribuída (heh). Nota:UIFont.systemFontOfSize(_)
agora é um inicializador disponível, portanto, ele precisa ser desembrulhado antes que você possa usá-lo:E depois anexá-lo:
Em seguida, você pode definir o UILabel para exibir o NSAttributedString assim:
fonte
//Part 1 Set Up The Lower Case g var coffeeText = NSMutableAttributedString(string:"\(calculateCoffee())") //Part 2 set the font attributes for the lower case g var coffeeTypeFaceAttributes = [NSFontAttributeName : UIFont.systemFontOfSize(18)] //Part 3 create the "g" character and give it the attributes var coffeeG = NSMutableAttributedString(string:"g", attributes:coffeeTypeFaceAttributes)
Quando eu definir o meu UILabel.text = coffeeText eu recebo um erro "NSMutableAttributedString não é convertível para 'String' Existe uma maneira de fazer o UILabel aceitar NSMutableAttributedString.?Versão do Xcode 6 :
Versão do Xcode 9.3 :
Xcode 10, iOS 12, Swift 4 :
fonte
Swift 4:
fonte
Type 'NSAttributedStringKey' (aka 'NSString') has no member 'font'
Eu recomendo o uso de uma biblioteca para seqüências de caracteres atribuídas. Isso facilita muito quando você deseja, por exemplo, uma sequência com quatro cores diferentes e quatro fontes diferentes. Aqui está o meu favorito. É chamado SwiftyAttributes
Se você deseja criar uma sequência com quatro cores diferentes e fontes diferentes usando SwiftyAttributes:
finalString
mostraria comofonte
Swift: xcode 6.1
fonte
A melhor maneira de abordar as Attributed Strings no iOS é usar o editor de Texto Atribuído interno no construtor de interfaces e evitar NSAtrributedStringKeys codificadas e desnecessárias em seus arquivos de origem.
Posteriormente, você pode substituir dinamicamente os placehoderls em tempo de execução usando esta extensão:
Adicione um rótulo de storyboard com o texto atribuído desta forma.
Então você simplesmente atualiza o valor sempre que precisar:
Certifique-se de salvar em initalAttributedString o valor original.
Você pode entender melhor essa abordagem lendo este artigo: https://medium.com/mobile-appetite/text-attributes-on-ios-the-effortless-approach-ff086588173e
fonte
let nsRange = NSRange(range,in:valueString)
linha.Swift 2.0
Aqui está uma amostra:
Swift 5.x
OU
fonte
Funciona bem na versão 6
fonte
Eu criei uma ferramenta online que vai resolver o seu problema! Você pode escrever sua sequência e aplicar estilos graficamente, e a ferramenta fornece o código objetivo e o código rápido para gerar essa sequência.
Também é de código aberto, portanto, fique à vontade para estendê-lo e enviar PRs.
Ferramenta Transformador
Github
fonte
Swift 5 e acima
fonte
//Implementação
fonte
Swift 4
Você precisa remover o valor bruto no swift 4
fonte
Para mim, as soluções acima não funcionavam ao definir uma cor ou propriedade específica.
Isso funcionou:
fonte
Swift 2.1 - Xcode 7
fonte
Use este código de exemplo. Este é um código muito curto para atender às suas necessidades. Isso está funcionando para mim.
fonte
fonte
Os atributos podem ser configurados diretamente em ...
Em seguida, use a variável em qualquer classe com atributos
fonte
Swift 4.2
fonte
Detalhes
Solução
Uso
Exemplo completo
Resultado
fonte
Será realmente fácil resolver seu problema com a biblioteca que eu criei. É chamado Atributika.
Você pode encontrá-lo aqui https://github.com/psharanda/Atributika
fonte
fonte
Swifter Swift tem uma maneira bem legal de fazer isso sem nenhum trabalho. Basta fornecer o padrão que deve ser correspondido e quais atributos aplicar a ele. Eles são ótimos para muitas coisas, confira.
Se você tiver vários locais onde isso seria aplicado e você desejar que isso ocorra apenas em instâncias específicas, esse método não funcionará.
Você pode fazer isso em uma etapa, apenas mais fácil de ler quando separado.
fonte
Swift 4.x
fonte
Swift 3.0 // cria uma string atribuída
Defina atributos como
fonte
Por favor, considere usar Prestyler
fonte
Swift 5
fonte
}
// Use-o como abaixo
fonte