Tek bir etikette birden çok yazı tipi rengi kullanın


88

İOS'ta tek bir etikette iki, hatta üç yazı tipi rengi kullanmanın bir yolu var mı?

Örnek olarak "merhaba, nasılsın" metni kullanılmış olsaydı, "merhaba" mavi olurdu ve "nasılsın" yeşil olurdu?

Bu mümkün mü, birden çok etiket oluşturmaktan daha kolay görünüyor?


UILabel'in atıfta bulunulan metin özelliğini kullanmayı deneyin. stackoverflow.com/questions/3586871/…
rakeshbs

Dize olarak aralık rengine eklemek istiyorsunuz
Kirit Modi 01.01.2015

Yanıtlar:


150

Buradan referans.

Öncelikle NSString ve NSMutableAttributedString'i aşağıdaki gibi başlatınız .

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

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

ÇIKTI

görüntü açıklamasını buraya girin

ÇOKLU RENK

Bir dizede birden çok renk elde etmek için ViewDidLoad'a aşağıdaki satır kodunu ekleyin.

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

Çoklu renk ÇIKIŞI

görüntü açıklamasını buraya girin

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
iki aralık özelliği ekleyebilir misin, yoksa bunu nasıl aşarım?
Justin Rose

60

@Hems Moradiya için

görüntü açıklamasını buraya girin

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

39

Swift 4

Aşağıdaki uzantı işlevini kullanarak, bir renk özelliğini doğrudan öznitelikli bir dizeye ayarlayabilir ve aynısını etiketinize uygulayabilirsiniz.

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

}

Bir etiket kullanarak yukarıdaki uzantıyı deneyin:

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)

Sonuç:

görüntü açıklamasını buraya girin


@Krunal Renkleri değiştirmek için birden çok dizeyi desteklemek için bu nasıl değiştirilebilir ...? Altında ------------ başlıkları olan uzun bir dizem var, ancak yukarıdaki kod iyi çalışıyor ancak yalnızca ilk bulunan olanı renklendiriyor. Bu, tüm --------- dizeleri belirli bir renkte olacak şekilde değiştirilebilir ....? Teşekkürler.
Omid CompSCI

bu böyle bir metin için işe yaramayacak: "flowstackoverflow" yalnızca ilk akışı değiştirecek, ancak sonuncusuna ihtiyacımız var, bunu nasıl başarabiliriz?
swift2geek

19

Swift 4 için Güncellenmiş Cevap

Çeşitli metin biçimlendirmelerini kolayca yapmak için UILabel'in attributedText özelliği içinde html'yi kolayca kullanabilirsiniz.

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

görüntü açıklamasını buraya girin

Swift 2 için Güncellenmiş Cevap

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
Bu hata mesajını aldım: '(data: NSData, options: [String: String], documentAttributes: _, error: _)' türünde bir argüman listesi ile 'NSAttributedString' türü için başlatıcı çağrılamıyor
Qian Chen

2
Swift 2'de değişiklikler var. Lütfen güncellenmiş cevabımı kontrol edin.
rakeshbs

10

İşte Swift 5 için bir çözüm

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

görüntü açıklamasını buraya girin


7

Kullanılmış rakeshbs 'ın cevabı Swift 2'de bir uzantısı oluşturmak için:

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

Kullanım:

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

Veya tek astarlılar için bile

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

Uzantıyla ilgili iyi olan şey , tüm uygulamanız boyunca .attributedStringFromHtmltüm StringURL'ler için özniteliğe sahip olmanızdır .


6

SWIFT 5 için GÜNCELLEME

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

Kodumda bir uzantı oluşturuyorum

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

    }
}

ve bu kullanım için

override func viewDidLoad() {
        super.viewDidLoad()

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

    }

6

Bu şekilde sevdim

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) 

Bu basit olan için teşekkürler.
Nikhil Manapure


5

Swift 3.0

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

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

sonuç:

Daha fazla renk için, değiştirilebilir dizgeye nitelikler eklemeye devam edebilirsiniz. Burada daha fazla örnek .


1

Swift 4 UILabel Uzantısı

Benim durumumda, etiketler içinde sık sık farklı renkler / yazı tipleri ayarlayabilmem gerekiyordu, bu yüzden Krunal'ın NSMutableAttributedString uzantısını kullanarak bir UILabel uzantısı yaptım .

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

}

Şu şekilde kullanılabilir:

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

1

Cocoapod Prestyler'ı kullanın :

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

0

HTML sürümünü kullanan Swift 3 örneği.

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

İşte Swift'in Mart 2017'deki En Son sürümünü destekleyen kod .

Swift 3.0

Burada bir Helper sınıfı ve

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

Yöntem Parametrelerinde, inputText: String - etiket konumunda görüntülenecek Metniniz: Int - burada stilin uygulama, dizenin başlangıcı olarak "0" veya dize uzunluğunun karakter konumu olarak geçerli bir değer olması gerekir: Int - From Bu stilin kaç karaktere kadar uygulanabileceği.

Başka bir yöntemle tüketmek:

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

Çıktı:

görüntü açıklamasını buraya girin

Not: UI Rengi, renk olarak UIColor.redveya kullanıcı tanımlı renkler olarak tanımlanabilir.UIColor(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

bu NSForegroundColorAttributeName'i hızlı bir alt sürümde kullanmak için, çözülmemiş tanımlayıcı sorunları elde edebilirsiniz, yukarıdakileri NSAttributedStringKey.foregroundColor olarak değiştirin .

             swift lower version                swift latest version

yani, 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

Sonuç

Sonuç


0

Bunu uygulamanızda birçok kez kullanmak istiyorsanız, sadece UILabel uzantısını oluşturabilirsiniz ve bu daha basit hale gelecektir: -

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

Etiketinizi kullanın: -

yourLabel = "Hello Test"
yourLabel.setSpannedColor(fullText: totalLabel.text!, changeText: "Test")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.