Làm đậm văn bản bằng cách sử dụng chuỗi phân bổ nhanh chóng


100

Tôi có một chuỗi như thế này

var str = "@text1 this is good @text1"

Bây giờ thay thế text1bằng một chuỗi khác, nói t 1. Tôi có thể thay thế văn bản, nhưng tôi không thể in đậm nó. Tôi muốn in đậm chuỗi mới t 1để kết quả cuối cùng sẽ là:

@t 1 cái này hay quá @t 1

Tôi làm nó như thế nào?

Tất cả các ví dụ tôi đang thấy là trong Objective-C, nhưng tôi muốn làm điều đó trong Swift.

Cảm ơn trước.


1
Bạn cần giải quyết vấn đề của mình: Tìm hiểu cách "in đậm": stackoverflow.com/questions/25199580/… Tìm hiểu cách thay thế văn bản.
Larme

1
Sử dụng thư viện này, nó rất đơn giản. github.com/iOSTechHub/AttributedString
Ashish Chauhan

Câu trả lời:


234

Sử dụng:

let label = UILabel()
label.attributedText =
    NSMutableAttributedString()
        .bold("Address: ")
        .normal(" Kathmandu, Nepal\n\n")
        .orangeHighlight(" Email: ")
        .blackHighlight(" prajeet.shrestha@gmail.com ")
        .bold("\n\nCopyright: ")
        .underlined(" All rights reserved. 2020.")

Kết quả:

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

Đây là một cách gọn gàng để tạo sự kết hợp giữa văn bản in đậm và bình thường trong một nhãn duy nhất cùng với một số phương pháp bổ sung khác.

Phần mở rộng: Swift 5. *

extension NSMutableAttributedString {
    var fontSize:CGFloat { return 14 }
    var boldFont:UIFont { return UIFont(name: "AvenirNext-Bold", size: fontSize) ?? UIFont.boldSystemFont(ofSize: fontSize) }
    var normalFont:UIFont { return UIFont(name: "AvenirNext-Regular", size: fontSize) ?? UIFont.systemFont(ofSize: fontSize)}

    func bold(_ value:String) -> NSMutableAttributedString {

        let attributes:[NSAttributedString.Key : Any] = [
            .font : boldFont
        ]

        self.append(NSAttributedString(string: value, attributes:attributes))
        return self
    }

    func normal(_ value:String) -> NSMutableAttributedString {

        let attributes:[NSAttributedString.Key : Any] = [
            .font : normalFont,
        ]

        self.append(NSAttributedString(string: value, attributes:attributes))
        return self
    }
    /* Other styling methods */
    func orangeHighlight(_ value:String) -> NSMutableAttributedString {

        let attributes:[NSAttributedString.Key : Any] = [
            .font :  normalFont,
            .foregroundColor : UIColor.white,
            .backgroundColor : UIColor.orange
        ]

        self.append(NSAttributedString(string: value, attributes:attributes))
        return self
    }

    func blackHighlight(_ value:String) -> NSMutableAttributedString {

        let attributes:[NSAttributedString.Key : Any] = [
            .font :  normalFont,
            .foregroundColor : UIColor.white,
            .backgroundColor : UIColor.black

        ]

        self.append(NSAttributedString(string: value, attributes:attributes))
        return self
    }

    func underlined(_ value:String) -> NSMutableAttributedString {

        let attributes:[NSAttributedString.Key : Any] = [
            .font :  normalFont,
            .underlineStyle : NSUnderlineStyle.single.rawValue

        ]

        self.append(NSAttributedString(string: value, attributes:attributes))
        return self
    }
}

nó không dành cho swift 2?
remy boys

2
Một bổ sung nhỏ: func bold(_ text:String, _ size:CGFloat). Tôi đã thêm kích thước vào phần đậm để có thể kiểm soát nó từ bên ngoài. Ngoài ra, tôi đã bỏ lỡ AvenirNext-Mediumphông chữ trong chức năng này nên tôi đã mất vài phút để hiểu tại sao tôi không thể nhìn thấy phông chữ của mình. Đứng lên.
Gal

bạn đã cứu ngày của tôi, dude!
oskarko

Cảm ơn! Làm việc như quyến rũ :)
Sharad Chauhan

1
Ballay ballay sarkaaar: D
Mohsin Khubaib Ahmed

102
var normalText = "Hi am normal"

var boldText  = "And I am BOLD!"

var attributedString = NSMutableAttributedString(string:normalText)

var attrs = [NSFontAttributeName : UIFont.boldSystemFont(ofSize: 15)]
var boldString = NSMutableAttributedString(string: boldText, attributes:attrs)

attributedString.append(boldString)

Khi bạn muốn gán nó vào một nhãn:

yourLabel.attributedText = attributedString

Câu trả lời tuyệt vời! Cảm ơn!
hacker_1989

lưu ý: appendAttributedString đã được đổi tên thành .append ()
Andrea Leganza

28

chỉnh sửa / cập nhật: Xcode 8.3.2 • Swift 3.1

Nếu bạn biết HTML và CSS, bạn có thể sử dụng nó để dễ dàng kiểm soát kiểu phông chữ, màu sắc và kích thước của chuỗi phân bổ của bạn như sau:

extension String {
    var html2AttStr: NSAttributedString? {
        return try? NSAttributedString(data: Data(utf8), options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil)
    }
}

"<style type=\"text/css\">#red{color:#F00}#green{color:#0F0}#blue{color: #00F; font-weight: Bold; font-size: 32}</style><span id=\"red\" >Red,</span><span id=\"green\" > Green </span><span id=\"blue\">and Blue</span>".html2AttStr

Tôi đang cố gắng triển khai điều này trong Swift 2 Xcode, nhưng phông chữ không được áp dụng. Đây là chuỗi: <link href=\"https://fonts.googleapis.com/css?family=Frank+Ruhl+Libre\" rel=\"stylesheet\"> <span style=\"font-family: 'Frank Ruhl Libre', sans-serif;\">שלום</span>
DaniSmithProductiontions

Nếu nó sử dụng WebKit phong cách để phân tích cú pháp HTML chuỗi trong NSAttributedString, cẩn thận sử dụng nó trong một thread nền ...
FouZ

Lợi ích của việc sử dụng phương pháp này thay vì câu trả lời @prajeet là gì?
Emre Önder

17

Nếu bạn đang làm việc với các chuỗi được bản địa hóa, bạn có thể không dựa vào chuỗi in đậm luôn ở cuối câu. Nếu đúng như vậy thì những cách sau hoạt động tốt:

ví dụ: Truy vấn "blah" không khớp với bất kỳ mục nào

/* Create the search query part of the text, e.g. "blah". 
   The variable 'text' is just the value entered by  the user. */
let searchQuery = "\"\(text)\""

/* Put the search text into the message */
let message = "Query \(searchQuery). does not match any items"

/* Find the position of the search string. Cast to NSString as we want
   range to be of type NSRange, not Swift's Range<Index> */
let range = (message as NSString).rangeOfString(searchQuery)

/* Make the text at the given range bold. Rather than hard-coding a text size,
   Use the text size configured in Interface Builder. */
let attributedString = NSMutableAttributedString(string: message)
attributedString.addAttribute(NSFontAttributeName, value: UIFont.boldSystemFontOfSize(label.font.pointSize), range: range)

/* Put the text in a label */
label.attributedText = attributedString

2
Sau nhiều giờ tìm kiếm, đây là câu trả lời duy nhất tìm ra giải pháp cho vấn đề của tôi. +1
Super_Simon

9

Tôi đã mở rộng câu trả lời tuyệt vời của David West để bạn có thể nhập một chuỗi và cho nó biết tất cả các chuỗi con bạn muốn đưa vào:

func addBoldText(fullString: NSString, boldPartsOfString: Array<NSString>, font: UIFont!, boldFont: UIFont!) -> NSAttributedString {
    let nonBoldFontAttribute = [NSFontAttributeName:font!]
    let boldFontAttribute = [NSFontAttributeName:boldFont!]
    let boldString = NSMutableAttributedString(string: fullString as String, attributes:nonBoldFontAttribute)
    for i in 0 ..< boldPartsOfString.count {
        boldString.addAttributes(boldFontAttribute, range: fullString.rangeOfString(boldPartsOfString[i] as String))
    }
    return boldString
}

Và sau đó gọi nó như thế này:

let normalFont = UIFont(name: "Dosis-Medium", size: 18)
let boldSearchFont = UIFont(name: "Dosis-Bold", size: 18)
self.UILabel.attributedText = addBoldText("Check again in 30 days to find more friends", boldPartsOfString: ["Check", "30 days", "find", "friends"], font: normalFont!, boldFont: boldSearchFont!)

Điều này sẽ tô đậm tất cả các chuỗi con bạn muốn in đậm trong chuỗi đã cho của bạn


Có thể có cùng một từ in đậm ở hai nơi khác nhau? EX: "Kiểm tra lại sau 30 ngày để tìm 30 người bạn". Làm thế nào để bạn làm cho cả hai "30" đậm? Cảm ơn trước.
Dian

8

Đây là cách tốt nhất mà tôi đã nghĩ ra. Thêm một hàm mà bạn có thể gọi từ bất cứ đâu và thêm nó vào một tệp mà không có lớp như Constants.swift và sau đó bạn có thể nhúng các từ trong bất kỳ chuỗi nào, trong nhiều trường hợp bằng cách chỉ gọi MỘT DÒNG mã:

Để truy cập tệp constants.swift:

import Foundation
import UIKit

func addBoldText(fullString: NSString, boldPartOfString: NSString, font: UIFont!, boldFont: UIFont!) -> NSAttributedString {
   let nonBoldFontAttribute = [NSFontAttributeName:font!]
   let boldFontAttribute = [NSFontAttributeName:boldFont!]
   let boldString = NSMutableAttributedString(string: fullString as String, attributes:nonBoldFontAttribute)
   boldString.addAttributes(boldFontAttribute, range: fullString.rangeOfString(boldPartOfString as String))
   return boldString
}

Sau đó, bạn chỉ có thể gọi một dòng mã này cho bất kỳ Nhãn UIL nào:

self.UILabel.attributedText = addBoldText("Check again in 30 DAYS to find more friends", boldPartOfString: "30 DAYS", font: normalFont!, boldFont: boldSearchFont!)


//Mark: Albeit that you've had to define these somewhere:

let normalFont = UIFont(name: "INSERT FONT NAME", size: 15)
let boldFont = UIFont(name: "INSERT BOLD FONT", size: 15)

8

Dựa trên câu trả lời xuất sắc của Jeremy Bader và David West, một phần mở rộng Swift 3:

extension String {
    func withBoldText(boldPartsOfString: Array<NSString>, font: UIFont!, boldFont: UIFont!) -> NSAttributedString {
        let nonBoldFontAttribute = [NSFontAttributeName:font!]
        let boldFontAttribute = [NSFontAttributeName:boldFont!]
        let boldString = NSMutableAttributedString(string: self as String, attributes:nonBoldFontAttribute)
        for i in 0 ..< boldPartsOfString.count {
            boldString.addAttributes(boldFontAttribute, range: (self as NSString).range(of: boldPartsOfString[i] as String))
        }
        return boldString
    }
}

Sử dụng:

let label = UILabel()
let font = UIFont(name: "AvenirNext-Italic", size: 24)!
let boldFont = UIFont(name: "AvenirNext-BoldItalic", size: 24)!
label.attributedText = "Make sure your face is\nbrightly and evenly lit".withBoldText(
    boldPartsOfString: ["brightly", "evenly"], font: font, boldFont: boldFont)

5

sử dụng....

let attrString = NSMutableAttributedString()
            .appendWith(weight: .semibold, "almost bold")
            .appendWith(color: .white, weight: .bold, " white and bold")
            .appendWith(color: .black, ofSize: 18.0, " big black")

Hai xu...

extension NSMutableAttributedString {

    @discardableResult func appendWith(color: UIColor = UIColor.darkText, weight: UIFont.Weight = .regular, ofSize: CGFloat = 12.0, _ text: String) -> NSMutableAttributedString{
        let attrText = NSAttributedString.makeWith(color: color, weight: weight, ofSize:ofSize, text)
        self.append(attrText)
        return self
    }

}
extension NSAttributedString {

    public static func makeWith(color: UIColor = UIColor.darkText, weight: UIFont.Weight = .regular, ofSize: CGFloat = 12.0, _ text: String) -> NSMutableAttributedString {

        let attrs = [NSAttributedStringKey.font: UIFont.systemFont(ofSize: ofSize, weight: weight), NSAttributedStringKey.foregroundColor: color]
        return NSMutableAttributedString(string: text, attributes:attrs)
    }
}

1
iOS 11 trở lên (do sử dụng UIFont.Weight).
Andrea Leganza

4

Chấp nhận phản hồi của Prajeet Shrestha trong chủ đề này là hợp lệ , tôi muốn mở rộng giải pháp của anh ấy bằng cách sử dụng Nhãn nếu nó được biết và các đặc điểm của phông chữ.

Swift 4

extension NSMutableAttributedString {

    @discardableResult func normal(_ text: String) -> NSMutableAttributedString {
        let normal = NSAttributedString(string: text)
        append(normal)

        return self
    }

    @discardableResult func bold(_ text: String, withLabel label: UILabel) -> NSMutableAttributedString {

        //generate the bold font
        var font: UIFont = UIFont(name: label.font.fontName , size: label.font.pointSize)!
        font = UIFont(descriptor: font.fontDescriptor.withSymbolicTraits(.traitBold) ?? font.fontDescriptor, size: font.pointSize)

        //generate attributes
        let attrs: [NSAttributedStringKey: Any] = [NSAttributedStringKey.font: font]
        let boldString = NSMutableAttributedString(string:text, attributes: attrs)

        //append the attributed text
        append(boldString)

        return self
    }
}

4

Swift 4 trở lên

Đối với Swift 4 trở lên, đó là một cách tốt:

    let attributsBold = [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 16, weight: .bold)]
    let attributsNormal = [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 16, weight: .regular)]
    var attributedString = NSMutableAttributedString(string: "Hi ", attributes:attributsNormal)
    let boldStringPart = NSMutableAttributedString(string: "John", attributes:attributsBold)
    attributedString.append(boldStringPart)
  
    yourLabel.attributedText = attributedString

Trong Nhãn, Văn bản trông giống như: "Xin chào John "


3

Cách siêu dễ dàng để làm điều này.

    let text = "This string is having multiple font"
    let attributedText = 
    NSMutableAttributedString.getAttributedString(fromString: text)

    attributedText.apply(font: UIFont.boldSystemFont(ofSize: 24), subString: 
    "This")

    attributedText.apply(font: UIFont.boldSystemFont(ofSize: 24), onRange: 
    NSMakeRange(5, 6))

Để biết thêm chi tiết, hãy nhấp vào đây: https://github.com/iOSTechHub/AttributedString


Làm thế nào về bán đậm?
Houman

Đây phải là câu trả lời được chấp nhận. @Houman sử dụng thư viện trên và sử dụng các applyphương pháp với font bạn muốn
Zack Shapiro

2

Điều này có thể hữu ích

class func createAttributedStringFrom (string1 : String ,strin2 : String, attributes1 : Dictionary<String, NSObject>, attributes2 : Dictionary<String, NSObject>) -> NSAttributedString{

let fullStringNormal = (string1 + strin2) as NSString
let attributedFullString = NSMutableAttributedString(string: fullStringNormal as String)

attributedFullString.addAttributes(attributes1, range: fullStringNormal.rangeOfString(string1))
attributedFullString.addAttributes(attributes2, range: fullStringNormal.rangeOfString(strin2))
return attributedFullString
}

2

Swift 3.0

Chuyển đổi html thành chuỗi và thay đổi phông chữ theo yêu cầu của bạn.

do {

     let str = try NSAttributedString(data: ("I'm a normal text and <b>this is my bold part . </b>And I'm again in the normal text".data(using: String.Encoding.unicode, allowLossyConversion: true)!), options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil)

     myLabel.attributedText = str
     myLabel.font =  MONTSERRAT_BOLD(23)
     myLabel.textAlignment = NSTextAlignment.left
} catch {
     print(error)
}


func MONTSERRAT_BOLD(_ size: CGFloat) -> UIFont
{
    return UIFont(name: "MONTSERRAT-BOLD", size: size)!
}

Bạn nên chuyển đổi chuỗi của mình thành dữ liệu bằng utf8. Lưu ý rằng Dữ liệu tuân theo bộ sưu tập trong Swift 3 nên bạn có thể khởi tạo Dữ liệu bằng chế độ xem bộ sưu tập chuỗi utf8 của mình Data("I'm a normal text and <b>this is my bold part . </b>And I'm again in the normal text".utf8)và đặt mã hóa ký tự trong các tùy chọn[NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue]
Leo Dabus

0

Chỉ cần sử dụng mã như thế này:

 let font = UIFont(name: "Your-Font-Name", size: 10.0)!

        let attributedText = NSMutableAttributedString(attributedString: noteLabel.attributedText!)
        let boldedRange = NSRange(attributedText.string.range(of: "Note:")!, in: attributedText.string)
        attributedText.addAttributes([NSAttributedString.Key.font : font], range: boldedRange)
        noteLabel.attributedText = attributedText

0

hai lớp lót trong nhanh chóng 4:

            button.setAttributedTitle(.init(string: "My text", attributes: [.font: UIFont.systemFont(ofSize: 20, weight: .bold)]), for: .selected)
            button.setAttributedTitle(.init(string: "My text", attributes: [.font: UIFont.systemFont(ofSize: 20, weight: .regular)]), for: .normal)

0

Swift 5.1 sử dụng NSAttributedString.Keythay vìNSAttributedStringKey

let test1Attributes:[NSAttributedString.Key: Any] = [.font : UIFont(name: "CircularStd-Book", size: 14)!]
let test2Attributes:[NSAttributedString.Key: Any] = [.font : UIFont(name: "CircularStd-Bold", size: 16)!]

let test1 = NSAttributedString(string: "\(greeting!) ", attributes:test1Attributes)
let test2 = NSAttributedString(string: firstName!, attributes:test2Attributes)
let text = NSMutableAttributedString()

text.append(test1)
text.append(test2)
return text

0

Đối với -> Tìm kiếm Truyền hình theo kích thước

1 chiều sử dụng NString và Phạm vi của nó

let query = "Television"
let headerTitle = "size"
let message = "Search \(query) by \(headerTitle)"
let range = (message as NSString).range(of: query)
let attributedString = NSMutableAttributedString(string: message)
attributedString.addAttribute(NSAttributedString.Key.font, value: UIFont.boldSystemFont(ofSize: label1.font.pointSize), range: range)
label1.attributedText = attributedString

khác mà không sử dụng NString và Phạm vi của nó

let query = "Television"
let headerTitle = "size"
let (searchText, byText) = ("Search ", " by \(headerTitle)")
let attributedString = NSMutableAttributedString(string: searchText)
let byTextAttributedString = NSMutableAttributedString(string: byText)
let attrs = [NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: label1.font.pointSize)]
let boldString = NSMutableAttributedString(string: query, attributes:attrs)
attributedString.append(boldString)
attributedString.append(byTextAttributedString)
label1.attributedText = attributedString

nhanh chóng5


-1

Cải thiện câu trả lời của Prajeet Shrestha: -

Bạn có thể tạo một phần mở rộng chung cho NSMutableAttributedString, phần mở rộng này bao gồm ít mã hơn. Trong trường hợp này, tôi đã chọn sử dụng phông chữ hệ thống nhưng bạn có thể điều chỉnh nó để bạn có thể nhập tên phông chữ làm tham số.

    extension NSMutableAttributedString {

        func systemFontWith(text: String, size: CGFloat, weight: CGFloat) -> NSMutableAttributedString {
            let attributes: [String: AnyObject] = [NSFontAttributeName: UIFont.systemFont(ofSize: size, weight: weight)]
            let string = NSMutableAttributedString(string: text, attributes: attributes)
            self.append(string)
            return self
        }
    }

-1

Bạn có thể làm điều này bằng cách sử dụng phương pháp tùy chỉnh đơn giản được viết bên dưới. Bạn đã cung cấp toàn bộ chuỗi trong tham số đầu tiên và văn bản được in đậm trong tham số thứ hai. Hy vọng điều này sẽ giúp ích.

func getAttributedBoldString(str : String, boldTxt : String) -> NSMutableAttributedString {
        let attrStr = NSMutableAttributedString.init(string: str)
        let boldedRange = NSRange(str.range(of: boldTxt)!, in: str)
        attrStr.addAttributes([NSAttributedString.Key.font : UIFont.systemFont(ofSize: 17, weight: .bold)], range: boldedRange)
        return attrStr
    }

cách sử dụng: initalString = Tôi là con trai

label.attributedText = getAttributedBoldString (str: initalString, boldTxt: "Boy")

resultant string = Tôi là một cậu bé

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.