Sử dụng nhiều màu phông chữ trong một nhãn duy nhất


88

Có cách nào để sử dụng hai hoặc thậm chí ba màu phông chữ trong một nhãn duy nhất trong iOS không?

Nếu văn bản "xin chào, bạn thế nào" được sử dụng làm ví dụ, "xin chào" sẽ có màu xanh lam và "bạn có khỏe không" sẽ có màu xanh lục?

Điều này có khả thi không, nó có vẻ dễ dàng hơn việc tạo nhiều nhãn?


Hãy thử sử dụng thuộc tính văn bản được phân bổ của UILabel. stackoverflow.com/questions/3586871/…
rakeshbs

Bạn muốn thêm Vào dải màu trong chuỗi
Kirit Modi

Câu trả lời:


150

Tham khảo từ đây.

Trước hết bạn khởi tạo NSStringNSMutableAttributedString như bên dưới.

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

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

ĐẦU RA

nhập mô tả hình ảnh ở đây

NHIỀU MÀU

Thêm mã dòng bên dưới vào ViewDidLoad của bạn để có nhiều màu trong một chuỗi.

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

Nhiều màu OUTPUT

nhập mô tả hình ảnh ở đây

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
bạn có thể thêm hai thuộc tính phạm vi không, nếu không, làm cách nào để khắc phục điều đó?
Justin Rose

59

Đối với @Hems Moradiya

nhập mô tả hình ảnh ở đây

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

Bằng cách sử dụng hàm mở rộng sau, bạn có thể đặt trực tiếp thuộc tính màu cho một chuỗi được phân bổ và áp dụng điều tương tự trên nhãn của mình.

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

}

Hãy thử phần mở rộng phía trên, sử dụng nhãn:

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)

Kết quả:

nhập mô tả hình ảnh ở đây


@Krunal Điều này có thể được sửa đổi như thế nào để hỗ trợ nhiều chuỗi thay đổi màu sắc ...? Tôi có một chuỗi dài với tiêu đề bên dưới có ------------, nhưng mã ở trên hoạt động tốt nhưng nó chỉ tô màu cho mã được tìm thấy đầu tiên. Điều này có thể được sửa đổi để làm tất cả --------- chuỗi thành một màu nhất định ....? Cảm ơn.
Omid CompSCI

điều này sẽ không hoạt động đối với văn bản như thế này: "flowstackoverflow" nó sẽ chỉ thay đổi luồng đầu tiên, nhưng chúng ta cần luồng cuối cùng, làm thế nào để đạt được điều đó?
swift2geek

19

Câu trả lời cập nhật cho Swift 4

Bạn có thể dễ dàng sử dụng html bên trong thuộc tính AttutedText của UILabel để dễ dàng thực hiện các định dạng văn bản khác nhau.

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

nhập mô tả hình ảnh ở đây

Câu trả lời cập nhật cho 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
Tôi nhận được thông báo lỗi này: Không thể gọi trình khởi tạo cho loại 'NSAttributedString' với danh sách đối số thuộc loại '(dữ liệu: NSData, tùy chọn: [String: String], documentAttributes: _, error: _)'
Qian Chen

2
có những thay đổi trong Swift 2. Vui lòng kiểm tra câu trả lời cập nhật của tôi.
rakeshbs

9

Đây là giải pháp cho 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

nhập mô tả hình ảnh ở đây


7

Đã sử dụng câu trả lời của rakeshbs để tạo tiện ích mở rộng trong 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
    }
}

Sử dụng:

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

Hoặc thậm chí cho một lớp lót

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

Điều tốt về tiện ích mở rộng là bạn sẽ có .attributedStringFromHtmlthuộc tính cho tất cả các Strings trong toàn bộ ứng dụng của mình.


6

Tôi thích nó theo cách này

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) 

Cảm ơn vì điều này đơn giản.
Nikhil Manapure,

6

CẬP NHẬT cho 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

Trong mã của tôi, tôi tạo một phần mở rộng

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

    }
}

và cái này để sử dụng

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

kết quả:

Để có thêm màu sắc, bạn có thể tiếp tục thêm các thuộc tính vào chuỗi có thể thay đổi. Thêm ví dụ ở đây .


1

Tiện ích mở rộng nhãn Swift 4

Trong trường hợp của tôi, tôi cần có khả năng đặt các màu / phông chữ khác nhau trong các nhãn thường xuyên, vì vậy tôi đã tạo một phần mở rộng UILabel bằng phần mở rộng NSMutableAttributedString của 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

}

Nó có thể được sử dụng như thế này:

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

1

Sử dụng cocoapod Prestyler :

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

0

Ví dụ Swift 3 sử dụng phiên bản 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

Đây là mã hỗ trợ phiên bản Swift mới nhất vào tháng 3 năm 2017.

Swift 3.0

Ở đây tôi đã tạo một lớp và phương thức của Người trợ giúp cho

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

Trong Tham số phương thức, inputText: String - Văn bản của bạn sẽ được hiển thị ở vị trí nhãn: Int - nơi mà kiểu phải được áp dụng, "0" ở đầu chuỗi hoặc một số giá trị hợp lệ làm vị trí ký tự của độ dài chuỗi: Int - From vị trí cho đến khi có bao nhiêu ký tự mà kiểu này có thể áp dụng.

Tiêu dùng theo phương pháp khác:

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

Đầu ra:

nhập mô tả hình ảnh ở đây

Lưu ý: Màu giao diện người dùng có thể được xác định là màu UIColor.redhoặc màu do người dùng xác định là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

để sử dụng NSForegroundColorAttributeName này trong phiên bản nhanh hơn, bạn có thể nhận được các vấn đề về số nhận dạng chưa được giải quyết, thay đổi ở trên thành NSAttributedStringKey.foregroundColor .

             swift lower version                swift latest version

nghĩa là 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

Kết quả

Kết quả

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.