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
textView.atrributedtText = myString
oumyLabel.attributedText = myString
au début de votre réponse. En tant que débutant , je faisais justemyLabel.text
et ne pense pas que je devais passer par toute votre réponse. ** 3) ** Est - ce que cela signifie que vous ne pouvez avoir soitattributedText
outext
comme les ayant à la fois seraient dénuées de sens? 4) Je vous recommande également d'intégrer unlineSpacing
exemple comme celui-ci dans votre réponse car il est très utile. 5) ачаар дахинappendAttributedString
est comme la «concaténation de chaînes».addAttribute
ajoute un nouvel attribut à votre chaîne.addAttribute
est une méthode deNSMutableAttributedString
. Vous avez raison de ne pas pouvoir l'utiliser avecString
ouNSAttributedString
. (Vérifiez lamyString
définition dans la section Changer une chaîne attribuée de ce post. Je pense que je vous ai jeté parce que j'ai également utilisémyString
le nom de variable dans la première partie du post où il étaitNSAttributedString
.)Swift utilise la même chose
NSMutableAttributedString
qu'Obj-C. Vous l'instanciez en passant la valeur calculée sous forme de chaîne:Créez maintenant la
g
chaîne attribuée (heh). Remarque:UIFont.systemFontOfSize(_)
est désormais un initialiseur disponible, il doit donc être déballé avant de pouvoir l'utiliser:Et puis ajoutez-le:
Vous pouvez ensuite définir le UILabel pour afficher le NSAttributedString comme ceci:
la source
//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)
Quand je tournerai mon UILabel.text = coffeeText je reçois une erreur « NSMutableAttributedString n'est pas à convertable « String » Y at - il un moyen de faire accepter la UILabel NSMutableAttributedString.?Version Xcode 6 :
Version Xcode 9.3 :
Xcode 10, iOS 12, Swift 4 :
la source
Swift 4:
la source
Type 'NSAttributedStringKey' (aka 'NSString') has no member 'font'
Je recommande fortement d'utiliser une bibliothèque pour les chaînes attribuées. Cela rend beaucoup plus facile lorsque vous voulez, par exemple, une chaîne avec quatre couleurs différentes et quatre polices différentes. Voici mon préféré. Il s'appelle SwiftyAttributes
Si vous vouliez créer une chaîne avec quatre couleurs et polices différentes à l'aide de SwiftyAttributes:
finalString
montrerait commela source
Swift: xcode 6.1
la source
La meilleure façon d'approcher les chaînes attribuées sur iOS est d'utiliser l'éditeur de texte attribué intégré dans le générateur d'interface et d'éviter le codage en dur inutile NSAtrributedStringKeys dans vos fichiers source.
Vous pouvez ultérieurement remplacer dynamiquement placehoderls au moment de l'exécution en utilisant cette extension:
Ajoutez une étiquette de storyboard avec un texte attribué ressemblant à ceci.
Ensuite, vous mettez simplement à jour la valeur chaque fois que vous en avez besoin comme ceci:
Assurez-vous d'enregistrer dans initalAttributedString la valeur d'origine.
Vous pouvez mieux comprendre cette approche en lisant cet article: https://medium.com/mobile-appetite/text-attributes-on-ios-the-effortless-approach-ff086588173e
la source
let nsRange = NSRange(range,in:valueString)
ligne.Swift 2.0
Voici un exemple:
Swift 5.x
OU
la source
Fonctionne bien en version bêta 6
la source
J'ai créé un outil en ligne qui va résoudre votre problème! Vous pouvez écrire votre chaîne et appliquer des styles graphiquement et l'outil vous donne un code objectif-c et rapide pour générer cette chaîne.
Il est également open source, alors n'hésitez pas à l'étendre et à envoyer des RP.
Transformer Tool
Github
la source
Swift 5 et supérieur
la source
//La mise en oeuvre
la source
Swift 4
Vous devez supprimer la valeur brute dans swift 4
la source
Pour moi, les solutions ci-dessus ne fonctionnaient pas lors de la définition d'une couleur ou d'une propriété spécifique.
Cela a fonctionné:
la source
Swift 2.1 - Xcode 7
la source
Utilisez cet exemple de code. Il s'agit d'un code très court pour répondre à vos besoins. Cela fonctionne pour moi.
la source
la source
Les attributs peuvent être définis directement dans swift 3 ...
Ensuite, utilisez la variable dans n'importe quelle classe avec des attributs
la source
Swift 4.2
la source
Détails
Solution
Usage
Exemple complet
Résultat
la source
Il sera très facile de résoudre votre problème avec la bibliothèque que j'ai créée. Cela s'appelle Atributika.
Vous pouvez le trouver ici https://github.com/psharanda/Atributika
la source
la source
Swifter Swift a une façon assez douce de le faire sans vraiment travailler. Fournissez simplement le modèle qui doit être mis en correspondance et les attributs à lui appliquer. Ils sont parfaits pour beaucoup de choses, vérifiez-les.
Si vous avez plusieurs endroits où cela serait appliqué et que vous ne souhaitez que cela se produise pour des instances spécifiques, cette méthode ne fonctionnerait pas.
Vous pouvez le faire en une seule étape, plus facile à lire une fois séparé.
la source
Swift 4.x
la source
Swift 3.0 // créer une chaîne attribuée
Définissez des attributs comme
la source
Veuillez envisager d'utiliser Prestyler
la source
Swift 5
la source
}
// Utilisez-le comme ci-dessous
la source