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?

Justin Rose
la source
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))
Kirit Modi
la source
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
Keyur Hirani
la source
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
la source
@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")
}
rakeshbs
la source
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

Paul Wasilewski
la source
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.

mathielo
la source
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) 
jithin
la source
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)

    }
Ridho Octanio
la source
5

Se servir de NSMutableAttributedString

myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSRange(location:2,length:4))

entrez la description de l'image ici

Voir plus de détails ici rapides utilisant-cordes attribué

Shamsudheen TK
la source
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 .

Cilvet
la source
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)
Pablo Garces
la source
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()
Kruiller
la source
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")
            }
spogebob92
la source
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)

BHUVANESH MOHANKUMAR
la source
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
    }
Arun
la source
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

Veerendra
la source
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

Tung Tran
la source