Cette réponse a été mise à jour pour Swift 4.2.
Référence rapide
La forme générale pour créer et définir une chaîne attribuée est la suivante. Vous pouvez trouver d'autres options courantes ci-dessous.
// 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 ]
Le reste de cet article donne plus de détails pour ceux qui sont intéressés.
Les attributs
Les attributs de chaîne ne sont qu'un dictionnaire sous la forme de [NSAttributedString.Key: Any]
, où NSAttributedString.Key
est le nom de clé de l'attribut et Any
la valeur d'un type. La valeur peut être une police, une couleur, un entier ou autre chose. Il existe de nombreux attributs standard dans Swift qui ont déjà été prédéfinis. Par exemple:
- nom de la clé:,
NSAttributedString.Key.font
valeur: aUIFont
- nom de la clé:,
NSAttributedString.Key.foregroundColor
valeur: aUIColor
- nom de clé:,
NSAttributedString.Key.link
valeur: an NSURL
ouNSString
Il y en a bien d'autres. Voir ce lien pour en savoir plus. Vous pouvez même créer vos propres attributs personnalisés comme:
nom de la clé:, NSAttributedString.Key.myName
valeur: certains Type.
si vous faites une extension :
extension NSAttributedString.Key {
static let myName = NSAttributedString.Key(rawValue: "myCustomAttributeKey")
}
Création d'attributs dans Swift
Vous pouvez déclarer des attributs tout comme déclarer tout autre dictionnaire.
// 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" ]
Notez ce rawValue
qui était nécessaire pour la valeur de style de soulignement.
Étant donné que les attributs ne sont que des dictionnaires, vous pouvez également les créer en créant un dictionnaire vide, puis en y ajoutant des paires clé-valeur. Si la valeur contient plusieurs types, vous devez utiliserAny
comme type. Voici l' multipleAttributes
exemple ci-dessus, recréé de cette façon:
var multipleAttributes = [NSAttributedString.Key : Any]()
multipleAttributes[NSAttributedString.Key.foregroundColor] = UIColor.green
multipleAttributes[NSAttributedString.Key.backgroundColor] = UIColor.yellow
multipleAttributes[NSAttributedString.Key.underlineStyle] = NSUnderlineStyle.double.rawValue
Chaînes attribuées
Maintenant que vous comprenez les attributs, vous pouvez créer des chaînes attribuées.
Initialisation
Il existe plusieurs façons de créer des chaînes attribuées. Si vous avez juste besoin d'une chaîne en lecture seule, vous pouvez l'utiliser NSAttributedString
. Voici quelques façons de l'initialiser:
// 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)
Si vous devez modifier les attributs ou le contenu de la chaîne ultérieurement, vous devez utiliser NSMutableAttributedString
. Les déclarations sont très similaires:
// 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)
Modification d'une chaîne attribuée
À titre d'exemple, créons la chaîne attribuée en haut de cet article.
Créez d'abord un NSMutableAttributedString
avec un nouvel attribut de police.
let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myString = NSMutableAttributedString(string: "Swift", attributes: myAttribute )
Si vous travaillez, définissez la chaîne attribuée à un UITextView
(ou UILabel
) comme ceci:
textView.attributedText = myString
Vous n'utilisez .textView.text
Voici le résultat:
Ensuite, ajoutez une autre chaîne attribuée qui n'a aucun attribut défini. (Notez que même si j'avais l'habitude let
de déclarer myString
ci-dessus, je peux toujours le modifier parce que c'est un NSMutableAttributedString
. Cela me semble plutôt peu rapide et je ne serais pas surpris si cela change à l'avenir. Laissez-moi un commentaire lorsque cela se produira.)
let attrString = NSAttributedString(string: " Attributed Strings")
myString.append(attrString)
Ensuite, nous allons simplement sélectionner le mot "Strings", qui commence à l'index 17
et a une longueur de 7
. Notez que c'est un NSRange
et non un Swift Range
. (Voir cette réponse pour en savoir plus sur les plages.) La addAttribute
méthode nous permet de mettre le nom de clé d'attribut au premier endroit, la valeur d'attribut au deuxième endroit et la plage au troisième endroit.
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)
Enfin, ajoutons une couleur d'arrière-plan. Pour la variété, utilisons la addAttributes
méthode (notez le s
). Je pourrais ajouter plusieurs attributs à la fois avec cette méthode, mais je vais simplement en ajouter un à nouveau.
myRange = NSRange(location: 3, length: 17)
let anotherAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
myString.addAttributes(anotherAttribute, range: myRange)
Notez que les attributs se chevauchent à certains endroits. L'ajout d'un attribut n'écrase pas un attribut qui existe déjà.
en relation
Lectures complémentaires
NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue | NSUnderlineStyle.PatternDot.rawValue