Questa risposta è stata aggiornata per Swift 4.2.
Riferimento rapido
La forma generale per creare e impostare una stringa attribuita è così. Di seguito puoi trovare altre opzioni comuni.
// 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 ]
Il resto di questo post fornisce maggiori dettagli per coloro che sono interessati.
attributi
Gli attributi di stringa sono solo un dizionario sotto forma di [NSAttributedString.Key: Any]
, dove NSAttributedString.Key
è il nome chiave dell'attributo ed Any
è il valore di un tipo. Il valore potrebbe essere un carattere, un colore, un numero intero o qualcos'altro. Ci sono molti attributi standard in Swift che sono già stati predefiniti. Per esempio:
- nome chiave:,
NSAttributedString.Key.font
valore: aUIFont
- nome chiave:,
NSAttributedString.Key.foregroundColor
valore: aUIColor
- nome chiave:,
NSAttributedString.Key.link
valore: an NSURL
oNSString
Ce ne sono molti altri. Vedi questo link per di più. Puoi persino creare i tuoi attributi personalizzati come:
nome chiave:, NSAttributedString.Key.myName
valore: un certo Tipo.
se fai un'estensione :
extension NSAttributedString.Key {
static let myName = NSAttributedString.Key(rawValue: "myCustomAttributeKey")
}
Creazione di attributi in Swift
Puoi dichiarare gli attributi proprio come dichiarare qualsiasi altro dizionario.
// 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" ]
Si noti rawValue
che era necessario per il valore di stile sottolineato.
Poiché gli attributi sono solo dizionari, puoi anche crearli creando un dizionario vuoto e quindi aggiungendo coppie chiave-valore. Se il valore conterrà più tipi, è necessario utilizzarlo Any
come tipo. Ecco l' multipleAttributes
esempio dall'alto, ricreato in questo modo:
var multipleAttributes = [NSAttributedString.Key : Any]()
multipleAttributes[NSAttributedString.Key.foregroundColor] = UIColor.green
multipleAttributes[NSAttributedString.Key.backgroundColor] = UIColor.yellow
multipleAttributes[NSAttributedString.Key.underlineStyle] = NSUnderlineStyle.double.rawValue
Stringhe attribuite
Ora che hai compreso gli attributi, puoi creare stringhe attribuite.
Inizializzazione
Esistono alcuni modi per creare stringhe attribuite. Se hai solo bisogno di una stringa di sola lettura puoi usare NSAttributedString
. Ecco alcuni modi per inizializzarlo:
// 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 in seguito sarà necessario modificare gli attributi o il contenuto della stringa, è necessario utilizzare NSMutableAttributedString
. Le dichiarazioni sono molto simili:
// 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)
Modifica di una stringa attribuita
Ad esempio, creiamo la stringa attribuita nella parte superiore di questo post.
Innanzitutto crea un NSMutableAttributedString
con un nuovo attributo font.
let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myString = NSMutableAttributedString(string: "Swift", attributes: myAttribute )
Se stai lavorando insieme, imposta la stringa attribuita a un UITextView
(o UILabel
) in questo modo:
textView.attributedText = myString
Tu non usi textView.text
.
Ecco il risultato:
Quindi aggiungere un'altra stringa attribuita che non ha alcun attributo impostato. (Nota che, anche se ero solito let
dichiarare myString
sopra, posso ancora modificarlo perché è un NSMutableAttributedString
. Questo mi sembra piuttosto poco rapido e non sarei sorpreso se questo dovesse cambiare in futuro. Lasciami un commento quando succede.)
let attrString = NSAttributedString(string: " Attributed Strings")
myString.append(attrString)
Successivamente selezioneremo semplicemente la parola "Stringhe", che inizia dall'indice 17
e ha una lunghezza di 7
. Si noti che questo è un NSRange
e non uno Swift Range
. (Vedi questa risposta per ulteriori informazioni sugli intervalli.) Il addAttribute
metodo ci consente di mettere il nome della chiave dell'attributo nel primo punto, il valore dell'attributo nel secondo punto e l'intervallo nel terzo punto.
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)
Infine, aggiungiamo un colore di sfondo. Per varietà, usiamo il addAttributes
metodo (nota il s
). Potrei aggiungere più attributi contemporaneamente con questo metodo, ma ne aggiungerò di nuovo uno.
myRange = NSRange(location: 3, length: 17)
let anotherAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
myString.addAttributes(anotherAttribute, range: myRange)
Si noti che gli attributi si sovrappongono in alcuni punti. L'aggiunta di un attributo non sovrascrive un attributo già presente.
Relazionato
Ulteriori letture
NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue | NSUnderlineStyle.PatternDot.rawValue