Gunakan beberapa warna font dalam satu label

88

Apakah ada cara untuk menggunakan dua, atau bahkan tiga warna font dalam satu label di iOS?

Jika teks "halo, apa kabar" digunakan sebagai contoh, "halo" akan berwarna biru, dan "apa kabar" akan berwarna hijau?

Apakah ini mungkin, tampaknya lebih mudah daripada membuat banyak label?

Justin Rose
sumber
Coba gunakan properti teks yang diatribusikan dari UILabel. stackoverflow.com/questions/3586871/…
rakeshbs
Anda ingin menambahkan To range color dalam string
Kirit Modi

Jawaban:

150

Referensi dari sini.

Pertama-tama inisialisasi NSString dan NSMutableAttributedString seperti di bawah ini.

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

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

KELUARAN

masukkan deskripsi gambar di sini

WARNA GANDA

Tambahkan kode baris di bawah ini di ViewDidLoad Anda untuk mendapatkan beberapa warna dalam sebuah string.

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

OUTPUT berbagai warna

masukkan deskripsi gambar di sini

Cepat 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
sumber
1
dapatkah Anda menambahkan dua properti rentang, jika tidak, bagaimana cara menyiasatinya?
Justin Rose
60

Untuk @Hems Moradiya

masukkan deskripsi gambar di sini

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

Cepat 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

Cepat 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
sumber
39

Cepat 4

Dengan menggunakan fungsi ekstensi berikut, Anda dapat langsung menyetel atribut warna ke string yang diatribusikan dan menerapkan hal yang sama pada label Anda.

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

}

Coba ekstensi di atas, menggunakan label:

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)

Hasil:

masukkan deskripsi gambar di sini

Krunal
sumber
@Krunal Bagaimana ini bisa dimodifikasi untuk mendukung banyak string untuk mengubah warna ...? Saya memiliki string panjang dengan header di bawahnya yang memiliki ------------, tetapi kode di atas berfungsi dengan baik tetapi hanya mewarnai yang pertama ditemukan. Bisakah ini dimodifikasi untuk melakukan semua --------- string ke warna tertentu ....? Terima kasih.
Omid CompSCI
ini tidak akan berfungsi untuk teks seperti ini: "flowstackoverflow" itu hanya akan mengubah aliran pertama, tapi kita membutuhkan yang terakhir, bagaimana mencapainya?
swift2geek
19

Jawaban yang Diperbarui untuk Swift 4

Anda dapat dengan mudah menggunakan html di dalam properti atributedText dari UILabel untuk dengan mudah melakukan berbagai pemformatan teks.

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

masukkan deskripsi gambar di sini

Jawaban yang Diperbarui untuk 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
sumber
2
Saya mendapat pesan kesalahan ini: Tidak dapat memanggil penginisialisasi untuk tipe 'NSAttributedString' dengan daftar argumen tipe '(data: NSData, opsi: [String: String], documentAttributes: _, error: _)'
Qian Chen
2
ada perubahan di Swift 2. Silakan periksa jawaban saya yang diperbarui.
rakeshbs
10

Berikut solusi untuk 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

masukkan deskripsi gambar di sini

Paul Wasilewski
sumber
7

Jawaban rakeshbs yang digunakan untuk membuat ekstensi di 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
    }
}

Pemakaian:

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

Atau bahkan untuk satu baris

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

Hal yang baik tentang ekstensi ini adalah Anda akan memiliki .attributedStringFromHtmlatribut untuk semua Stringdi seluruh aplikasi Anda.

mathielo
sumber
6

UPDATE untuk 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

Dalam kode saya, saya membuat ekstensi

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

    }
}

dan ini untuk digunakan

override func viewDidLoad() {
        super.viewDidLoad()

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

    }
Ridho Octanio
sumber
6

Saya suka seperti ini

let yourAttributes = [NSAttributedString.Key.foregroundColor: UIColor.black, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 15)]
    let yourOtherAttributes = [NSAttributedString.Key.foregroundColor: UIColor.red, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 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.append(partOne)
    combination.append(partTwo) 
jithin
sumber
Terima kasih untuk yang sederhana ini.
Nikhil Manapure
5

Swift 3.0.0

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

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

hasil:

Untuk lebih banyak warna, Anda bisa terus menambahkan atribut ke string yang bisa berubah. Lebih banyak contoh di sini .

Cilvet
sumber
1

Swift 4 Ekstensi UILabel

Dalam kasus saya, saya harus dapat mengatur warna / font yang berbeda dalam label sesering mungkin, jadi saya membuat ekstensi UILabel menggunakan ekstensi NSMutableAttributedString 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

}

Ini bisa digunakan seperti ini:

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

Gunakan cocoapod Prestyler :

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

Contoh Swift 3 menggunakan versi 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.dll
sumber
0

Berikut adalah kode yang mendukung Swift versi terbaru pada Maret 2017.

Swift 3.0.0

Di sini saya telah membuat kelas dan metode Helper untuk

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

Di Parameter Metode, inputText: String - Teks Anda akan ditampilkan di lokasi label: Int - di mana gayanya harus berupa aplikasi, "0" sebagai awal string atau beberapa nilai yang valid sebagai posisi karakter dari panjang string: Int - Dari lokasi hingga berapa banyak karakter gaya ini berlaku.

Mengkonsumsi dengan metode lain:

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

Keluaran:

masukkan deskripsi gambar di sini

Catatan: Warna UI dapat didefinisikan sebagai warna UIColor.redatau warna yang ditentukan pengguna sebagaiUIColor(red: 0.401107, green: 0.352791, blue: 0.503067, alpha: 1.0)

BHUVANESH MOHANKUMAR
sumber
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
sumber
0

untuk menggunakan NSForegroundColorAttributeName ini dalam versi cepat yang lebih rendah, Anda bisa mendapatkan masalah pengenal yang belum terselesaikan, ubah di atas menjadi NSAttributedStringKey.foregroundColor .

             swift lower version                swift latest version

yaitu, NSForegroundColorAttributeName == NSAttributedStringKey.foregroundColor

Veerendra
sumber
0

Swift 4.2.0

    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

Hasil

Hasil

Tung Tran
sumber
0

Jika Anda ingin menggunakan ini berkali-kali dalam aplikasi Anda, Anda dapat membuat ekstensi UILabel dan itu akan membuatnya lebih sederhana: -

Cepat 5

extension UILabel {
    func setSpannedColor (fullText : String , changeText : String ) {
        let strNumber: NSString = fullText as NSString
        let range = (strNumber).range(of: changeText)
        let attribute = NSMutableAttributedString.init(string: fullText)
        attribute.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red , range: range)
        self.attributedText = attribute
    }
}

Gunakan label Anda: -

yourLabel = "Hello Test"
yourLabel.setSpannedColor(fullText: totalLabel.text!, changeText: "Test")
Paresh Mangukiya
sumber