Use várias cores de fonte em um único rótulo

88

Existe uma maneira de usar duas ou até três cores de fonte em um único rótulo no iOS?

Se o texto "hello, how are you" fosse usado como exemplo, o "hello" seria azul e o "how are you" seria verde?

Isso é possível, parece mais fácil do que criar vários rótulos?

Justin rose
fonte
Tente usar a propriedade de texto atribuída do UILabel. stackoverflow.com/questions/3586871/…
rakeshbs
Você deseja adicionar a gama de cores na string
Kirit Modi

Respostas:

150

Referência aqui.

Em primeiro lugar, inicialize NSString e NSMutableAttributedString como abaixo.

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

Em 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()
}

RESULTADO

insira a descrição da imagem aqui

MULTIPLE COLOR

Adicione o código de linha abaixo em seu ViewDidLoad para obter várias cores em uma string.

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

OUTPUT de várias cores

insira a descrição da imagem aqui

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
fonte
1
você pode adicionar duas propriedades de intervalo, se não, como faço para contornar isso?
Justin Rose
58

Para @Hems Moradiya

insira a descrição da imagem aqui

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
fonte
38

Swift 4

Usando a seguinte função de extensão, você pode definir diretamente um atributo de cor para uma string atribuída e aplicar o mesmo em seu rótulo.

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)
    }

}

Experimente a extensão acima, usando um rótulo:

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)

Resultado:

insira a descrição da imagem aqui

Krunal
fonte
@Krunal Como isso pode ser modificado para oferecer suporte a várias strings para alterar as cores ...? Eu tenho uma longa string com cabeçalhos embaixo com ------------, mas o código acima funciona bem, mas colore apenas o primeiro encontrado. Isso pode ser modificado para fazer todas as --------- strings de uma determinada cor ....? Obrigado.
Omid CompSCI
isso não vai funcionar para um texto como este: "flowstackoverflow" vai mudar apenas o primeiro fluxo, mas precisamos do último, como conseguir isso?
swift2geek
19

Resposta atualizada para Swift 4

Você pode facilmente usar o html dentro da propriedade attributeText do UILabel para fazer várias formatações de texto.

 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")
    }

insira a descrição da imagem aqui

Resposta atualizada para 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
fonte
2
Recebi esta mensagem de erro: Não é possível chamar o inicializador para o tipo 'NSAttributedString' com uma lista de argumentos do tipo '(dados: NSData, opções: [String: String], documentAttributes: _, erro: _)'
Qian Chen
2
há mudanças no Swift 2. Verifique minha resposta atualizada.
rakeshbs
9

Aqui está uma solução para 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

insira a descrição da imagem aqui

Paul Wasilewski
fonte
7

Resposta de rakeshbs usada para criar uma extensão no 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
    }
}

Uso:

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

Ou mesmo para one-liners

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

A vantagem da extensão é que você terá .attributedStringFromHtmlatributos para todos os programas Stringem todo o aplicativo.

mathielo
fonte
6

Gostei assim

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
fonte
Obrigado por este simples.
Nikhil Manapure
6

ATUALIZAÇÃO para 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

No meu código, eu crio uma extensão

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

    }
}

e isso para uso

override func viewDidLoad() {
        super.viewDidLoad()

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

    }
Ridho Octanio
fonte
5

Fazer uso de NSMutableAttributedString

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

insira a descrição da imagem aqui

Veja mais detalhes aqui swift-using-atribuídos-strings

Shamsudheen TK
fonte
5

Swift 3.0

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

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

resultado:

Para mais cores, você pode simplesmente continuar adicionando atributos à string mutável. Mais exemplos aqui .

Cilvet
fonte
1

Extensão Swift 4 UILabel

No meu caso, eu precisava ser capaz de definir cores / fontes diferentes nos rótulos com frequência, então criei uma extensão UILabel usando a extensão NSMutableAttributedString do 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

}

Ele pode ser usado assim:

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

Use cocoapod Prestyler :

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

Exemplo do Swift 3 usando a versão 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
fonte
0

Aqui está o código que suporta a versão mais recente do Swift em março de 2017.

Swift 3.0

Aqui eu criei uma classe e método Helper para o

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
    }
}

Nos Parâmetros do Método, inputText: String - seu Texto a ser exibido no local do rótulo: Int - onde o estilo deve ser a aplicação, "0" como início da string ou algum valor válido como posição de caractere do comprimento da string: Int - De a localização até quantos caracteres este estilo é aplicável.

Consumindo em outro método:

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

Resultado:

insira a descrição da imagem aqui

Nota: A cor da IU pode ser definida como cor UIColor.redou cores definidas pelo usuário comoUIColor(red: 0.401107, green: 0.352791, blue: 0.503067, alpha: 1.0)

BHUVANESH MOHANKUMAR
fonte
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
    }
Uma corrida
fonte
0

para usar este NSForegroundColorAttributeName em uma versão inferior rápida, você pode obter problemas de identificador não resolvidos, altere o acima para NSAttributedStringKey.foregroundColor .

             swift lower version                swift latest version

ou seja, NSForegroundColorAttributeName == NSAttributedStringKey.foregroundColor

Veerendra
fonte
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

Resultado

Resultado

Tung Tran
fonte