Utilisez plusieurs couleurs de police dans une seule étiquette


88

Existe-t-il un moyen d'utiliser deux, voire trois couleurs de police dans une seule étiquette sous iOS?

Si le texte "bonjour, comment vas-tu" était utilisé comme exemple, le "bonjour" serait bleu et "comment vas-tu" serait vert?

Est-ce possible, cela semble plus facile que de créer plusieurs étiquettes?


Essayez d'utiliser la propriété de texte attribué de UILabel. stackoverflow.com/questions/3586871/…
rakeshbs

Vous voulez ajouter à la gamme de couleurs dans la chaîne
Kirit Modi

Réponses:


150

Référence d'ici.

Tout d'abord, initialisez NSString et NSMutableAttributedString comme ci-dessous.

var myString:NSString = "I AM KIRIT MODI"
var myMutableString = NSMutableAttributedString()

Dans ViewDidLoad

override func viewDidLoad() {

    myMutableString = NSMutableAttributedString(string: myString, attributes: [NSFontAttributeName:UIFont(name: "Georgia", size: 18.0)!])
    myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSRange(location:2,length:4))
    // set label Attribute
    labName.attributedText = myMutableString
    super.viewDidLoad()
}

PRODUCTION

entrez la description de l'image ici

COULEUR MULTIPLE

Ajoutez le code de ligne ci-dessous dans votre ViewDidLoad pour obtenir plusieurs couleurs dans une chaîne.

 myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.greenColor(), range: NSRange(location:10,length:5))

SORTIE couleur multiple

entrez la description de l'image ici

Swift 4

var myMutableString = NSMutableAttributedString(string: str, attributes: [NSAttributedStringKey.font :UIFont(name: "Georgia", size: 18.0)!])
myMutableString.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red, range: NSRange(location:2,length:4))

1
pouvez-vous ajouter deux propriétés de plage, sinon, comment puis-je contourner cela?
Justin Rose

58

Pour @Hems Moradiya

entrez la description de l'image ici

let attrs1 = [NSFontAttributeName : UIFont.boldSystemFontOfSize(18), NSForegroundColorAttributeName : UIColor.greenColor()]

let attrs2 = [NSFontAttributeName : UIFont.boldSystemFontOfSize(18), NSForegroundColorAttributeName : UIColor.whiteColor()]

let attributedString1 = NSMutableAttributedString(string:"Drive", attributes:attrs1)

let attributedString2 = NSMutableAttributedString(string:"safe", attributes:attrs2)

attributedString1.appendAttributedString(attributedString2)
self.lblText.attributedText = attributedString1

Swift 4

    let attrs1 = [NSAttributedStringKey.font : UIFont.boldSystemFont(ofSize: 18), NSAttributedStringKey.foregroundColor : UIColor.green]

    let attrs2 = [NSAttributedStringKey.font : UIFont.boldSystemFont(ofSize: 18), NSAttributedStringKey.foregroundColor : UIColor.white]

    let attributedString1 = NSMutableAttributedString(string:"Drive", attributes:attrs1)

    let attributedString2 = NSMutableAttributedString(string:"safe", attributes:attrs2)

    attributedString1.append(attributedString2)
    self.lblText.attributedText = attributedString1

Swift 5

    let attrs1 = [NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 18), NSAttributedString.Key.foregroundColor : UIColor.green]

    let attrs2 = [NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 18), NSAttributedString.Key.foregroundColor : UIColor.white]

    let attributedString1 = NSMutableAttributedString(string:"Drive", attributes:attrs1)

    let attributedString2 = NSMutableAttributedString(string:"safe", attributes:attrs2)

    attributedString1.append(attributedString2)
    self.lblText.attributedText = attributedString1

38

Swift 4

En utilisant la fonction d'extension suivante, vous pouvez directement définir un attribut de couleur sur une chaîne attribuée et appliquer la même chose sur votre étiquette.

extension NSMutableAttributedString {

    func setColorForText(textForAttribute: String, withColor color: UIColor) {
        let range: NSRange = self.mutableString.range(of: textForAttribute, options: .caseInsensitive)

        // Swift 4.2 and above
        self.addAttribute(NSAttributedString.Key.foregroundColor, value: color, range: range)

        // Swift 4.1 and below
        self.addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range)
    }

}

Essayez l'extension ci-dessus, en utilisant une étiquette:

let label = UILabel()
label.frame = CGRect(x: 60, y: 100, width: 260, height: 50)
let stringValue = "stackoverflow"

let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: stringValue)
attributedString.setColorForText(textForAttribute: "stack", withColor: UIColor.black)
attributedString.setColorForText(textForAttribute: "over", withColor: UIColor.orange)
attributedString.setColorForText(textForAttribute: "flow", withColor: UIColor.red)
label.font = UIFont.boldSystemFont(ofSize: 40)

label.attributedText = attributedString
self.view.addSubview(label)

Résultat:

entrez la description de l'image ici


@Krunal Comment cela peut-il être modifié pour prendre en charge plusieurs chaînes pour changer les couleurs ...? J'ai une longue chaîne avec en-dessous des en-têtes ayant ------------, mais le code ci-dessus fonctionne bien mais il ne colore que le premier trouvé. Cela peut-il être modifié pour que toutes les chaînes --------- soient d'une certaine couleur ....? Merci.
Omid CompSCI

cela ne fonctionnera pas pour un texte comme celui-ci: "flowstackoverflow" cela ne changera que le premier flux, mais nous avons besoin du dernier, comment y parvenir?
swift2geek

19

Réponse mise à jour pour Swift 4

Vous pouvez facilement utiliser html dans la propriété attribuéText de UILabel pour effectuer facilement divers formats de texte.

 let htmlString = "<font color=\"red\">This is  </font> <font color=\"blue\"> some text!</font>"

    let encodedData = htmlString.data(using: String.Encoding.utf8)!
    let attributedOptions = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType]
    do {
        let attributedString = try NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil)
        label.attributedText = attributedString

    } catch _ {
        print("Cannot create attributed String")
    }

entrez la description de l'image ici

Réponse mise à jour pour Swift 2

let htmlString = "<font color=\"red\">This is  </font> <font color=\"blue\"> some text!</font>"

let encodedData = htmlString.dataUsingEncoding(NSUTF8StringEncoding)!
let attributedOptions = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType]
do {
    let attributedString = try NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil)
    label.attributedText = attributedString

} catch _ {
    print("Cannot create attributed String")
}

2
J'ai reçu ce message d'erreur: Impossible d'appeler l'initialiseur pour le type 'NSAttributedString' avec une liste d'arguments de type '(données: NSData, options: [String: String], documentAttributes: _, erreur: _)'
Qian Chen

2
il y a des changements dans Swift 2. Veuillez vérifier ma réponse mise à jour.
rakeshbs

9

Voici une solution pour Swift 5

let label = UILabel()
let text = NSMutableAttributedString()
text.append(NSAttributedString(string: "stack", attributes: [NSAttributedString.Key.foregroundColor: UIColor.white]));
text.append(NSAttributedString(string: "overflow", attributes: [NSAttributedString.Key.foregroundColor: UIColor.gray]))
label.attributedText = text

entrez la description de l'image ici


7

A utilisé la réponse de rakeshbs pour créer une extension dans Swift 2:

// StringExtension.swift
import UIKit
import Foundation

extension String {

    var attributedStringFromHtml: NSAttributedString? {
        do {
            return try NSAttributedString(data: self.dataUsingEncoding(NSUTF8StringEncoding)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil)
        } catch _ {
            print("Cannot create attributed String")
        }
        return nil
    }
}

Usage:

let htmlString = "<font color=\"red\">This is  </font> <font color=\"blue\"> some text!</font>"
label.attributedText = htmlString.attributedStringFromHtml

Ou même pour les monoplaces

label.attributedText = "<font color=\"red\">This is  </font> <font color=\"blue\"> some text!</font>".attributedStringFromHtml

L'avantage de l'extension est que vous aurez un .attributedStringFromHtmlattribut pour tous les Strings dans toute votre application.


6

Je l'ai aimé de cette façon

let yourAttributes = [NSForegroundColorAttributeName: UIColor.black, NSFontAttributeName: UIFont.systemFontOfSize(15)]
let yourOtherAttributes = [NSForegroundColorAttributeName: UIColor.red, NSFontAttributeName: UIFont.systemFontOfSize(25)]

let partOne = NSMutableAttributedString(string: "This is an example ", attributes: yourAttributes)
let partTwo = NSMutableAttributedString(string: "for the combination of Attributed String!", attributes: yourOtherAttributes)

let combination = NSMutableAttributedString()

combination.appendAttributedString(partOne)
combination.appendAttributedString(partTwo) 

Merci pour ce simple.
Nikhil Manapure

6

MISE À JOUR pour SWIFT 5

func setDiffColor(color: UIColor, range: NSRange) {
     let attText = NSMutableAttributedString(string: self.text!)
     attText.addAttribute(NSAttributedString.Key.foregroundColor, value: color, range: range)
     attributedText = attText
}

SWIFT 3

Dans mon code, je crée une extension

import UIKit
import Foundation

extension UILabel {
    func setDifferentColor(string: String, location: Int, length: Int){

        let attText = NSMutableAttributedString(string: string)
        attText.addAttribute(NSForegroundColorAttributeName, value: UIColor.blueApp, range: NSRange(location:location,length:length))
        attributedText = attText

    }
}

et ceci pour l'usage

override func viewDidLoad() {
        super.viewDidLoad()

        titleLabel.setDifferentColor(string: titleLabel.text!, location: 5, length: 4)

    }


5

Swift 3.0

let myMutableString = NSMutableAttributedString(
                            string: "your desired text",
                            attributes: [:])

myMutableString.addAttribute(
                            NSForegroundColorAttributeName,
                            value: UIColor.blue,
                            range: NSRange(
                                location:6,
                                length:7))

résultat:

Pour plus de couleurs, vous pouvez simplement continuer à ajouter des attributs à la chaîne mutable. Plus d'exemples ici .


1

Extension Swift 4 UILabel

Dans mon cas, je devais être capable de définir fréquemment différentes couleurs / polices dans les étiquettes. J'ai donc créé une extension UILabel en utilisant l' extension NSMutableAttributedString de Krunal .

func highlightWords(phrases: [String], withColor: UIColor?, withFont: UIFont?) {

    let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: self.text!)

    for phrase in phrases {

        if withColor != nil {
            attributedString.setColorForText(textForAttribute: phrase, withColor: withColor!)
        }
        if withFont != nil {
            attributedString.setFontForText(textForAttribute: phrase, withFont: withFont!)
        }

    }

    self.attributedText = attributedString

}

Il peut être utilisé comme ceci:

yourLabel.highlightWords(phrases: ["hello"], withColor: UIColor.blue, withFont: nil)
yourLabel.highlightWords(phrases: ["how are you"], withColor: UIColor.green, withFont: nil)

1

Utilisez le cocoapod Prestyler :

Prestyle.defineRule("*", Color.blue)
Prestyle.defineRule("_", Color.red)
label.attributedText = "*This text is blue*, _but this one is red_".prestyled()

0

Exemple Swift 3 utilisant la version HTML.

let encodedData = htmlString.data(using: String.Encoding.utf8)!
            let attributedOptions = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType]
            do {
                let attributedString = try NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil)
                label.attributedText = attributedString
            } catch _ {
                print("Cannot create attributed String")
            }

0

Voici le code qui prend en charge la dernière version de Swift en mars 2017.

Swift 3.0

Ici, j'ai créé une classe et une méthode Helper pour le

public class Helper {

static func GetAttributedText(inputText:String, location:Int,length:Int) -> NSMutableAttributedString {
        let attributedText = NSMutableAttributedString(string: inputText, attributes: [NSFontAttributeName:UIFont(name: "Merriweather", size: 15.0)!])
        attributedText.addAttribute(NSForegroundColorAttributeName, value: UIColor(red: 0.401107, green: 0.352791, blue: 0.503067, alpha: 1.0) , range: NSRange(location:location,length:length))
       return attributedText
    }
}

Dans les paramètres de méthode, inputText: String - votre texte à afficher à l'emplacement de l'étiquette: Int - où le style doit être application, "0" comme début de chaîne ou une valeur valide comme position de caractère de la longueur de la chaîne: Int - De l'emplacement jusqu'à combien de caractères ce style est applicable.

Consommer dans une autre méthode:

self.dateLabel?.attributedText = Helper.GetAttributedText(inputText: "Date : " + (self.myModel?.eventDate)!, location:0, length: 6)

Production:

entrez la description de l'image ici

Remarque: La couleur de l'interface utilisateur peut être définie comme couleur UIColor.redou comme couleurs définies par l' utilisateur commeUIColor(red: 0.401107, green: 0.352791, blue: 0.503067, alpha: 1.0)


0
func MultiStringColor(first:String,second:String) -> NSAttributedString
    {
        let MyString1 = [NSFontAttributeName : FontSet.MonsRegular(size: 14), NSForegroundColorAttributeName : FoodConstant.PUREBLACK]

        let MyString2 = [NSFontAttributeName : FontSet.MonsRegular(size: 14), NSForegroundColorAttributeName : FoodConstant.GREENCOLOR]

        let attributedString1 = NSMutableAttributedString(string:first, attributes:MyString1)

        let attributedString2 = NSMutableAttributedString(string:second, attributes:MyString2)

        MyString1.append(MyString2)

        return MyString1
    }

0

pour utiliser ce NSForegroundColorAttributeName dans la version inférieure rapide, vous pouvez obtenir des problèmes d'identifiant non résolus, changez ce qui précède en NSAttributedStringKey.foregroundColor .

             swift lower version                swift latest version

ie, NSForegroundColorAttributeName == NSAttributedStringKey.foregroundColor


0

Swift 4.2

    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.alignment = NSTextAlignment.center

    var stringAlert = self.phoneNumber + "로\r로전송인증번호를입력해주세요"
    let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: stringAlert, attributes: [NSAttributedString.Key.paragraphStyle:paragraphStyle,  .font: UIFont(name: "NotoSansCJKkr-Regular", size: 14.0)])
    attributedString.setColorForText(textForAttribute: self.phoneNumber, withColor: UIColor.init(red: 1.0/255.0, green: 205/255.0, blue: 166/255.0, alpha: 1) )
    attributedString.setColorForText(textForAttribute: "로\r로전송인증번호를입력해주세요", withColor: UIColor.black)

    self.txtLabelText.attributedText = attributedString

Résultat

Résultat

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.