Membuat teks tebal menggunakan string yang diatribusikan dengan cepat

100

Saya memiliki tali seperti ini

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

Sekarang ganti text1dengan string lain, misalnya t 1. Saya dapat mengganti teks, tetapi saya tidak dapat menebalkannya. Saya ingin menebalkan string baru t 1, sehingga hasil akhirnya menjadi:

@t 1 ini bagus @t 1

Bagaimana saya bisa melakukannya?

Semua contoh yang saya lihat ada di Objective-C, tapi saya ingin melakukannya di Swift.

Terima kasih sebelumnya.

pengguna2413621
sumber
1
Anda perlu menguraikan masalah Anda: Pelajari cara "tebal": stackoverflow.com/questions/25199580/… Pelajari cara mengganti teks.
Larme
1
Gunakan pustaka ini, sangat sederhana. github.com/iOSTechHub/AttributedString
Ashish Chauhan

Jawaban:

237

Pemakaian:

let label = UILabel()
label.attributedText =
    NSMutableAttributedString()
        .bold("Address: ")
        .normal(" Kathmandu, Nepal\n\n")
        .orangeHighlight(" Email: ")
        .blackHighlight(" [email protected] ")
        .bold("\n\nCopyright: ")
        .underlined(" All rights reserved. 2020.")

Hasil:

masukkan deskripsi gambar di sini

Berikut adalah cara yang rapi untuk membuat kombinasi teks tebal dan normal dalam satu label ditambah beberapa metode bonus lainnya.

Ekstensi: 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
    }
}
Prajeet Shrestha
sumber
bukan untuk swift 2?
remy boys
2
Sebuah tambahan kecil: func bold(_ text:String, _ size:CGFloat). Saya menambahkan ukuran pada tebal sehingga saya dapat mengontrolnya dari luar. Juga, saya melewatkan AvenirNext-Mediumfont dalam fungsi ini jadi butuh beberapa menit untuk memahami mengapa saya tidak bisa melihat font saya. Perhatian.
Gal
kamu menyelamatkan hariku, bung!
oskarko
Terima kasih! Bekerja seperti pesona :)
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)

Saat Anda ingin menetapkannya ke label:

yourLabel.attributedText = attributedString
Dejan Skledar
sumber
Jawaban yang luar biasa! Terima kasih!
hacker_1989
catatan: appendAttributedString telah diubah namanya menjadi .append ()
Andrea Leganza
28

edit / perbarui: Xcode 8.3.2 • Swift 3.1

Jika Anda mengetahui HTML dan CSS, Anda dapat menggunakannya untuk mengontrol gaya font, warna, dan ukuran string yang dikaitkan dengan mudah sebagai berikut:

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
Leo Dabus
sumber
Saya mencoba menerapkan ini di Swift 2 Xcode, tetapi font tidak diterapkan. Ini adalah String: <link href=\"https://fonts.googleapis.com/css?family=Frank+Ruhl+Libre\" rel=\"stylesheet\"> <span style=\"font-family: 'Frank Ruhl Libre', sans-serif;\">שלום</span>
DaniSmithProductions
Jika gaya menggunakan WebKit untuk mengurai string HTML di NSAttributedString, hati-hati menggunakannya di utas latar belakang ...
FouZ
Apa manfaat menggunakan pendekatan ini daripada jawaban @prajeet?
Emre Önder
17

Jika Anda bekerja dengan string yang dilokalkan, Anda mungkin tidak dapat mengandalkan string tebal yang selalu berada di akhir kalimat. Jika ini masalahnya, maka berikut ini berfungsi dengan baik:

mis. Kueri "bla" tidak cocok dengan item mana pun

/* 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
Ian
sumber
2
Setelah berjam-jam mencari, inilah satu-satunya jawaban yang menemukan solusi untuk masalah saya. +1
Super_Simon
9

Saya memperpanjang jawaban hebat David West sehingga Anda dapat memasukkan string dan memberi tahu semua substring yang ingin Anda berani:

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
}

Dan kemudian menyebutnya seperti ini:

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

Ini akan memperkuat semua substring yang ingin Anda cetak tebal dalam string yang Anda berikan

Jeremy Bader
sumber
Apakah mungkin untuk menebalkan kata yang sama di dua tempat yang berbeda? EX: "Periksa lagi dalam 30 hari untuk menemukan 30 teman". Bagaimana Anda membuat kedua huruf "30" menjadi tebal? Terima kasih sebelumnya.
Dian
8

Ini adalah cara terbaik yang pernah saya lakukan. Tambahkan fungsi yang dapat Anda panggil dari mana saja dan tambahkan ke file tanpa kelas seperti Constants.swift dan kemudian Anda dapat memperkuat kata-kata dalam string apa pun, pada banyak kesempatan hanya dengan memanggil SATU BARIS kode:

Untuk masuk ke file 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
}

Kemudian Anda dapat memanggil satu baris kode ini untuk UILabel apa pun:

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)
David West
sumber
8

Membangun jawaban luar biasa Jeremy Bader dan David West, perpanjangan 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
    }
}

Pemakaian:

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)
Daniel McLean
sumber
5

pemakaian....

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

dua sen ...

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)
    }
}
Samuel
sumber
1
iOS 11 atau lebih tinggi (karena penggunaan UIFont. Berat).
Andrea Leganza
4

Menerima respons Prajeet Shrestha yang valid di utas ini, saya ingin memperluas solusinya menggunakan Label jika diketahui dan ciri-ciri font.

Cepat 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
    }
}
JSR - Silicornio
sumber
4

Swift 4 dan lebih tinggi

Untuk Swift 4 dan lebih tinggi, itu adalah cara yang baik:

    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

Di Label, Teksnya terlihat seperti: "Hai John "

Jonas Deichelmann
sumber
3

Cara super mudah untuk melakukan ini.

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

Untuk detail lebih lanjut klik di sini: https://github.com/iOSTechHub/AttributedString

Ashish Chauhan
sumber
Bagaimana dengan semi bold?
Houman
Ini harus menjadi jawaban yang diterima. @Houman gunakan pustaka di atas dan gunakan applymetode dengan font yang Anda inginkan
Zack Shapiro
2

Ini bisa bermanfaat

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
}
Martin Jacob
sumber
2

Swift 3.0.0

Ubah html menjadi string dan ubah font sesuai kebutuhan Anda.

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)!
}
Mitul Marsoniya
sumber
Anda harus mengonversi string Anda ke data menggunakan utf8. Perhatikan bahwa Data sesuai dengan koleksi di Swift 3 sehingga Anda dapat menginisialisasi Data dengan tampilan koleksi utf8 string Anda Data("I'm a normal text and <b>this is my bold part . </b>And I'm again in the normal text".utf8)dan menyetel pengkodean karakter dalam opsi[NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue]
Leo Dabus
0

Cukup gunakan kode seperti ini:

 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
Michał Ziobro
sumber
0

dua kapal dengan cepat 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)
Antzi
sumber
0

Penggunaan Swift 5.1,NSAttributedString.Key bukanNSAttributedStringKey

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
Yodagama
sumber
0

Untuk -> Cari Televisi berdasarkan ukuran

1 cara menggunakan NString dan Range nya

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

lain tanpa menggunakan NString dan Range-nya

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

swift5

Vinoth Anandan
sumber
-1

Memperbaiki jawaban Prajeet Shrestha: -

Anda dapat membuat ekstensi umum untuk NSMutableAttributedString yang melibatkan lebih sedikit kode. Dalam hal ini saya telah memilih untuk menggunakan font sistem tetapi Anda dapat menyesuaikannya sehingga Anda dapat memasukkan nama font sebagai parameter.

    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
        }
    }
Edward
sumber
-1

Anda dapat melakukan ini menggunakan metode kustom sederhana yang tertulis di bawah ini. Anda telah memberikan seluruh string pada parameter pertama dan teks untuk dicetak tebal pada parameter kedua. Semoga ini bisa membantu.

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
    }

penggunaan: initalString = Saya Laki-Laki

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

string resultan = I am a Boy

Muhammad Haroon Iqbal
sumber