Voici un petit programme montrant comment créer des chaines de caractères étendus contenant plusieurs polices différentes dans le même texte.

Code :
//
// ViewController.swift
// LabelsNSAttributedStringGiraffe
//
// Created by Patrick Leclercq on 11/08/2017.
// Copyright © 2017 Patrick Leclercq. All rights reserved.
//
import UIKit
// Extension pour modifier la font d'un NSMutableAttributedString
extension NSMutableAttributedString {
func modifierFont(font:UIFont) {
self.addAttribute(NSFontAttributeName,
value: font,
range:NSRange(location:0, length:self.length))
}
}
// Formatage des textes
func formatageTextes(titre : String,
nom : String,
fontTitre : UIFont,
fontNom : UIFont) -> NSAttributedString {
// Formatage titre
let attrTitre = NSMutableAttributedString(string:titre)
attrTitre.modifierFont(font: fontTitre)
// attrTitre.souligner(couleur: UIColor.blue)
// Formatage nom
let attrNom = NSMutableAttributedString(string:nom)
attrNom.modifierFont(font: fontNom)
// Addition des 2 textes
let texteComplet = NSMutableAttributedString(attributedString: attrTitre)
texteComplet.append(attrNom)
return texteComplet
}
// Exemple de mise en forme Gras
func miseEnFormeGras(titre : String,
nom : String) -> NSAttributedString {
let fontGras = UIFont.boldSystemFont(ofSize:15.0)
let fontNormal = UIFont.systemFont(ofSize:15.0)
return formatageTextes(titre : titre,
nom : nom,
fontTitre : fontGras,
fontNom : fontNormal)
}
// Exemple de mise en forme Italique
func miseEnFormeItalique(titre : String,
nom : String) -> NSAttributedString {
let fontItalique = UIFont.italicSystemFont(ofSize:15.0)
let fontNormal = UIFont.systemFont(ofSize:15.0)
return formatageTextes(titre : titre,
nom : nom,
fontTitre : fontItalique,
fontNom : fontNormal)
}
class ViewController: UIViewController {
@IBOutlet weak var unLabel: UILabel!
@IBOutlet weak var label2: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let titre = "Nom Prénom : "
let nom = "Barak Obama"
let formatGras = miseEnFormeGras(titre: titre, nom: nom)
let formatItalique = miseEnFormeItalique(titre: titre, nom: nom)
unLabel.attributedText = formatGras
label2.attributedText = formatItalique
}
}
Pour comprendre il faut savoir qu’il existe deux types de NSAttributedString :
- Les NSAttributedString classiques, dont le contenu ne peut PAS CHANGER !
- Les NSMutableAttributedString qui peuvent changer (muter)
C’est un reliquat de l’objectif-C. Dans la préhistoire, la plupart des types de données existaient en deux versions : normales avec un contenu fixe et mutable avec un contenu modifiable. En fait c’est toujours le cas, mais Swift fait du « camouflage » pour simplifier le code. Une variable définie avec un let est non-mutable (non modifiable), tandis qu’un var crée une donnée mutable (modifiable).
NSAttributedString n’ayant pas subi de cure de simplification en Swift 3.0, on doit encore s’embêter avec les versions mutables et non mutables. Peut-être que Swift 4 a amélioré les choses ? A vérifier.
EDIT : Après vérification, niet ! Les NSMutableAttributedString sont encore là en Swift 4.0. 
La manipulation des NSAttributedString n’étant vraiment pas simple, j’ai écrit une extension permettant de changer facilement la police de de caractère d’une chaîne, sans se soucier de tous les fichus paramètres.
extension NSMutableAttributedString {
func modifierFont(font:UIFont) {
self.addAttribute(NSFontAttributeName,
value: font,
range:NSRange(location:0, length:self.length))
}
}
Utilisation :
// Création d’une NSMutableAttributedString à partir d’une String
let attrTitre = NSMutableAttributedString(string: »Les sushis c’est bon ! »)
// Modification de la Font du texte
attrTitre.modifierFont(font: UIFont.systemFont(ofSize:15.0))
Pour afficher le contenu d’une NSAttributedString dans un label, il faut l’affecter à la propriété attributedText.
label.attributedText = attrTitre
A noter que les informations de mise en page d’un NSAttributedString sont prioritaires sur les réglages du Label, défini avec Storyboard. Quelque que soit le paramétrage du Label (police, couleur, taille, etc…) c’est le NSAttributedString qui prime.
Pour « mélanger » deux textes avec des polices de caractères différentes dans la même variable, il faut procéder en deux étapes :
-
1/ création des textes individuellement, avec application de la mise en page
-
2/ création d’une nouvelle variable par fusion des deux textes
// Formatage des textes
func formatageTextes(titre : String,
nom : String,
fontTitre : UIFont,
fontNom : UIFont) -> NSAttributedString {
// Formatage titre
let attrTitre = NSMutableAttributedString(string:titre)
attrTitre.modifierFont(font: fontTitre)
// Formatage nom
let attrNom = NSMutableAttributedString(string:nom)
attrNom.modifierFont(font: fontNom)
// Addition des 2 textes
let texteComplet = NSMutableAttributedString(attributedString: attrTitre)
texteComplet.append(attrNom)
return texteComplet
}
Tu peux remarquer que j’ai horreur de m’embêter avec les paramètres bas-niveau. C’est pourquoi j’écrit toujours des fonctions intermédiaires pour simplifier le code. C’est un style personnel, beaucoup de développeurs utilisent des paramètres bas-niveau dans le code final, pour avoir moins de fonctions et éviter de taper des lignes supplémentaires.