Mise en forme texte

Bonjour,

Il y a t’il un endroit ou trouver comment mettre du text en gras, souligner, italique etc etc …

Par exemple j’aimerai que “Nom Prénom :” soit en gras et souligné :

let typedNameFirstName:String = “Nom Prenom : (nameFirstName.text!)”

Merci d’avance!!!

:blush:

Bonjour,
Vous allez dans votre storyboard, vous sélectionnez votre label puis :

En faite je ne veux pas souligner du texte sur l’écran ou un label.

je voudrais souligner
let typedNameFirstName:String = "Nom Prenom : (nameFirstName.text!)

En gros je ne me contente pas d’envoyer juste la variable avec shareviewcontroller,
à la variable j’ajoute un texte “descriptif” et c’est ce texte que je voudrais souligner et mettre en gras.

Lorsque je clique sur mon bouton partager ce texte ça écrit :
Nom Prénom : XXXX

XXXX étant le nameFirstName.text

Et c’est Nom Prénom que je veux mettre en forme pas XXXX
Merci de votre aide

Il faut utiliser NSAttributedString. C’est une version évoluée de String, permettant de définir une mise en page complexe (couleur, police, taille, enrichissement diverses, etc…).

https://developer.apple.com/documentation/foundation/nsattributedstring

Ce n’est pas simple d’utilisation, mais très puissant.

http://forum.cocoacafe.fr/topic/15100-multiples-couleurs-sur-un-uilabel-incluant-plusieurs-nsstring/?hl=nsattributedstring

http://forum.cocoacafe.fr/topic/13832-nsattributedstring-with-different-font-size/?hl=nsattributedstring

Effectivement, je ne comprend pas du tout comment ça marche :joy:

Je voulais juste souligner “Nom Prénom :” pour que ce soit plus jolie…

Juste en gras ce serait plus joli. Je te fait un petit toto sur la question, d’ici ou deux jours (je suis un peu charrette en ce moment).

Sinon, il y a un autre solution : utiliser deux labels l’un à coté de l’autre, liés par une contrainte. Le premier pourrait être configuré pour afficher son contenu en gras souligné.

C’est très gentil!!

J’ai essayer de rajouter un label de souligner le label et d’appeler ce label dans
let typedNameFirstName:String = "(label) : (nameFirstName.text!)

mais ca affiche juste le texte pas le gras souligné etc…

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. :slightly_frowning_face:

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.

Merci beaucoup,

je vais me mettre dessus ce weekend pour comprendre tout ça!!

vu comme ça ca a l’air compliqué quand meme :sweat:

Probablement parce que c’est compliqué … Et encore, cela n’utilise même pas 5% des possibilités des NSAttributedString. C’est pourquoi je t’ai simplifié la tâche avec des fonctions spécialisées.

EDIT : Si j’ai le temps, je ferai aussi un petit tuto sur la manière d’afficher un texte avec deux labels liés l’un à l’autre.