Bagaimana cara membuat string yang dikaitkan menggunakan Swift?

316

Saya mencoba membuat Kalkulator Kopi sederhana. Saya perlu menampilkan jumlah kopi dalam gram. Simbol "g" untuk gram harus dilampirkan ke UILabel saya yang saya gunakan untuk menampilkan jumlahnya. Angka-angka dalam UILabel berubah secara dinamis dengan input pengguna baik-baik saja, tetapi saya perlu menambahkan huruf kecil "g" di ujung string yang diformat berbeda dari angka yang diperbarui. "G" harus dilampirkan ke angka sehingga saat ukuran dan posisi angka berubah, "g" "bergerak" dengan angka. Saya yakin masalah ini telah dipecahkan sebelumnya sehingga tautan ke arah yang benar akan sangat membantu karena saya telah meng-google-kan hati kecil saya.

Saya telah mencari di dalam dokumentasi untuk sebuah string yang dikaitkan dan saya bahkan menurunkan "Pencipta String yang Diberikan" dari app store, tetapi kode yang dihasilkan ada di Objective-C dan saya menggunakan Swift. Apa yang akan luar biasa, dan mungkin membantu pengembang lain yang mempelajari bahasa ini, adalah contoh yang jelas untuk membuat font khusus dengan atribut khusus menggunakan string yang dikaitkan di Swift. Dokumentasi untuk ini sangat membingungkan karena tidak ada jalan yang sangat jelas tentang cara melakukannya. Rencana saya adalah membuat string yang dikaitkan dan menambahkannya ke akhir string CoffeeAmount saya.

var coffeeAmount: String = calculatedCoffee + attributedText

Di mana CalculCoffee adalah Int yang dikonversi ke string dan "attributedText" adalah huruf kecil "g" dengan font khusus yang saya coba buat. Mungkin saya salah tentang hal ini. Bantuan apa pun dihargai!

dcbenji
sumber

Jawaban:

970

masukkan deskripsi gambar di sini

Jawaban ini telah diperbarui untuk Swift 4.2.

Referensi cepat

Bentuk umum untuk membuat dan mengatur string yang dikaitkan adalah seperti ini. Anda dapat menemukan opsi umum lainnya di bawah ini.

// create attributed string
let myString = "Swift Attributed String"
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttrString = NSAttributedString(string: myString, attributes: myAttribute) 

// set attributed text on a UILabel
myLabel.attributedText = myAttrString

Warna teks

let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]

Warna latar belakang

let myAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]

Fon

let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]

masukkan deskripsi gambar di sini

let myAttribute = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue ]

masukkan deskripsi gambar di sini

let myShadow = NSShadow()
myShadow.shadowBlurRadius = 3
myShadow.shadowOffset = CGSize(width: 3, height: 3)
myShadow.shadowColor = UIColor.gray

let myAttribute = [ NSAttributedString.Key.shadow: myShadow ]

Sisa dari posting ini memberikan lebih banyak detail bagi mereka yang tertarik.


Atribut

Atribut string hanyalah kamus dalam bentuk [NSAttributedString.Key: Any], di mana NSAttributedString.Keynama kunci atribut dan Anymerupakan nilai dari beberapa Tipe. Nilai bisa berupa font, warna, integer, atau yang lainnya. Ada banyak atribut standar di Swift yang telah ditentukan sebelumnya. Sebagai contoh:

  • nama kunci:, NSAttributedString.Key.fontnilai: aUIFont
  • nama kunci:, NSAttributedString.Key.foregroundColornilai: aUIColor
  • nama kunci:, NSAttributedString.Key.linknilai: an NSURLatauNSString

Ada banyak lainnya. Lihat tautan ini untuk lebih lanjut. Anda bahkan dapat membuat atribut khusus Anda sendiri seperti:

  • nama kunci:, NSAttributedString.Key.myNamenilai: beberapa Jenis.
    jika Anda membuat ekstensi :

    extension NSAttributedString.Key {
        static let myName = NSAttributedString.Key(rawValue: "myCustomAttributeKey")
    }
    

Membuat atribut di Swift

Anda dapat mendeklarasikan atribut seperti halnya mendeklarasikan kamus lainnya.

// single attributes declared one at a time
let singleAttribute1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let singleAttribute2 = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let singleAttribute3 = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]

// multiple attributes declared at once
let multipleAttributes: [NSAttributedString.Key : Any] = [
    NSAttributedString.Key.foregroundColor: UIColor.green,
    NSAttributedString.Key.backgroundColor: UIColor.yellow,
    NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]

// custom attribute
let customAttribute = [ NSAttributedString.Key.myName: "Some value" ]

Perhatikan rawValuebahwa itu diperlukan untuk nilai gaya garis bawah.

Karena atribut hanyalah Kamus, Anda juga dapat membuatnya dengan membuat Kamus kosong dan kemudian menambahkan pasangan nilai kunci ke dalamnya. Jika nilainya akan berisi banyak jenis, maka Anda harus menggunakan Anysebagai jenisnya. Berikut adalah multipleAttributescontoh dari atas, dibuat ulang dengan cara ini:

var multipleAttributes = [NSAttributedString.Key : Any]()
multipleAttributes[NSAttributedString.Key.foregroundColor] = UIColor.green
multipleAttributes[NSAttributedString.Key.backgroundColor] = UIColor.yellow
multipleAttributes[NSAttributedString.Key.underlineStyle] = NSUnderlineStyle.double.rawValue

String yang dikaitkan

Sekarang setelah Anda memahami atribut, Anda dapat membuat string yang dikaitkan.

Inisialisasi

Ada beberapa cara untuk membuat string yang dikaitkan. Jika Anda hanya membutuhkan string read-only yang dapat Anda gunakan NSAttributedString. Berikut ini beberapa cara untuk menginisialisasi:

// Initialize with a string only
let attrString1 = NSAttributedString(string: "Hello.")

// Initialize with a string and inline attribute(s)
let attrString2 = NSAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])

// Initialize with a string and separately declared attribute(s)
let myAttributes1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let attrString3 = NSAttributedString(string: "Hello.", attributes: myAttributes1)

Jika nanti Anda perlu mengubah atribut atau konten string, Anda harus menggunakannya NSMutableAttributedString. Deklarasi sangat mirip:

// Create a blank attributed string
let mutableAttrString1 = NSMutableAttributedString()

// Initialize with a string only
let mutableAttrString2 = NSMutableAttributedString(string: "Hello.")

// Initialize with a string and inline attribute(s)
let mutableAttrString3 = NSMutableAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])

// Initialize with a string and separately declared attribute(s)
let myAttributes2 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let mutableAttrString4 = NSMutableAttributedString(string: "Hello.", attributes: myAttributes2)

Mengubah String yang Dikaitkan

Sebagai contoh, mari kita buat string yang dikaitkan di bagian atas posting ini.

Pertama buat NSMutableAttributedStringdengan atribut font baru.

let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myString = NSMutableAttributedString(string: "Swift", attributes: myAttribute )

Jika Anda bekerja bersama, setel string yang dikaitkan dengan UITextView(atau UILabel) seperti ini:

textView.attributedText = myString

Anda tidak menggunakan textView.text.

Inilah hasilnya:

masukkan deskripsi gambar di sini

Kemudian tambahkan string terkait lainnya yang tidak memiliki set atribut apa pun. (Perhatikan bahwa meskipun saya pernah letmenyatakan di myStringatas, saya masih dapat memodifikasinya karena itu adalah NSMutableAttributedString. Ini sepertinya tidak disukai bagi saya dan saya tidak akan terkejut jika ini berubah di masa depan. Beri saya komentar ketika itu terjadi.)

let attrString = NSAttributedString(string: " Attributed Strings")
myString.append(attrString)

masukkan deskripsi gambar di sini

Selanjutnya kita hanya akan memilih kata "Strings", yang dimulai pada indeks 17dan memiliki panjang 7. Perhatikan bahwa ini adalah NSRangedan bukan Swift Range. (Lihat jawaban ini untuk informasi lebih lanjut tentang Rentang.) addAttributeMetode ini memungkinkan kita meletakkan nama kunci atribut di tempat pertama, nilai atribut di tempat kedua, dan rentang di tempat ketiga.

var myRange = NSRange(location: 17, length: 7) // range starting at location 17 with a lenth of 7: "Strings"
myString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red, range: myRange)

masukkan deskripsi gambar di sini

Akhirnya, mari kita tambahkan warna latar belakang. Untuk variasi, mari gunakan addAttributesmetode ini (perhatikan s). Saya bisa menambahkan beberapa atribut sekaligus dengan metode ini, tetapi saya hanya akan menambahkan satu lagi.

myRange = NSRange(location: 3, length: 17)
let anotherAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
myString.addAttributes(anotherAttribute, range: myRange)

masukkan deskripsi gambar di sini

Perhatikan bahwa atributnya tumpang tindih di beberapa tempat. Menambahkan atribut tidak menimpa atribut yang sudah ada di sana.

Terkait

Bacaan lebih lanjut

Suragch
sumber
4
Perhatikan bahwa Anda dapat menggabungkan beberapa gaya untuk garis bawah, misalnyaNSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue | NSUnderlineStyle.PatternDot.rawValue
beeb
3
Anda tidak dapat menggunakan appendAttributedString di NSAttributedString harus di NSMutableAttributedString, dapatkah Anda memperbarui jawaban Anda untuk mencerminkan ini?
Joseph Astrahan
3
1) Super terima kasih atas jawaban Anda. 2) Saya menyarankan agar Anda menempatkan textView.atrributedtText = myStringatau myLabel.attributedText = myStringdi awal jawaban Anda. Sebagai seorang pemula saya hanya melakukan myLabel.textdan tidak berpikir saya perlu melewati semua jawaban Anda. ** 3) ** Apakah ini berarti bahwa Anda hanya dapat memiliki salah satu attributedTextatau textmemiliki keduanya tidak akan berarti? 4) Saya sarankan Anda juga memasukkan lineSpacingcontoh seperti ini dalam jawaban Anda karena sangat berguna. 5) ачаар дахин
Honey
1
Perbedaan antara append dan add membingungkan dulu. appendAttributedStringseperti 'string concatenation'. addAttributemenambahkan atribut baru ke string Anda.
Sayang
2
@Aniel, addAttributeadalah metode NSMutableAttributedString. Anda benar bahwa Anda tidak dapat menggunakannya dengan Stringatau NSAttributedString. (Periksa myStringdefinisi di bagian Mengubah String yang Ditautkan dari pos ini. Saya rasa saya mengusir Anda karena saya juga menggunakan myStringuntuk nama variabel di bagian pertama dari pos di mana ia berada NSAttributedString.)
Suragch
114

Swift menggunakan hal yang sama seperti NSMutableAttributedStringyang dilakukan Obj-C. Anda instantiate dengan meneruskan nilai yang dihitung sebagai string:

var attributedString = NSMutableAttributedString(string:"\(calculatedCoffee)")

Sekarang buat gstring yang dikaitkan (heh). Catatan: UIFont.systemFontOfSize(_) sekarang merupakan inisialisasi yang tersedia, sehingga harus dibuka sebelum Anda dapat menggunakannya:

var attrs = [NSFontAttributeName : UIFont.systemFontOfSize(19.0)!]
var gString = NSMutableAttributedString(string:"g", attributes:attrs)

Dan kemudian menambahkannya:

attributedString.appendAttributedString(gString)

Anda kemudian dapat mengatur UILabel untuk menampilkan NSAttributedString seperti ini:

myLabel.attributedText = attributedString
NRitH
sumber
//Part 1 Set Up The Lower Case g var coffeeText = NSMutableAttributedString(string:"\(calculateCoffee())") //Part 2 set the font attributes for the lower case g var coffeeTypeFaceAttributes = [NSFontAttributeName : UIFont.systemFontOfSize(18)] //Part 3 create the "g" character and give it the attributes var coffeeG = NSMutableAttributedString(string:"g", attributes:coffeeTypeFaceAttributes) Ketika saya mengatur UILabel.text = coffeeText saya mendapatkan kesalahan "NSMutableAttributedString tidak dapat dikonversi ke 'String'. Apakah ada cara untuk membuat UILabel menerima NSMutableAttributedString?
dcbenji
11
Saat Anda memiliki string yang dikaitkan, Anda perlu mengatur properti attributedText label alih-alih properti teksnya.
NRitH
1
Ini bekerja dengan baik dan huruf kecil saya "g" sekarang ditambahkan ke akhir teks jumlah kopi saya
dcbenji
2
Untuk beberapa alasan saya mendapatkan "argumen panggilan ekstra" kesalahan pada saluran saya dengan NSAttributedString. Ini hanya terjadi ketika saya mengganti UIFont.systemFontOfSize (18) ke UIFont (nama: "Arial", ukuran: 20). Ada ide?
Unome
UIFont (nama: ukuran :) adalah penginisialisasi yang tersedia dan dapat mengembalikan nol. Anda dapat membukanya secara eksplisit dengan menambahkan! di akhir atau ikat ke variabel dengan pernyataan if / let sebelum Anda memasukkannya ke dalam kamus.
Ash
21

Versi Xcode 6 :

let attriString = NSAttributedString(string:"attriString", attributes:
[NSForegroundColorAttributeName: UIColor.lightGrayColor(), 
            NSFontAttributeName: AttriFont])

Versi Xcode 9.3 :

let attriString = NSAttributedString(string:"attriString", attributes:
[NSAttributedStringKey.foregroundColor: UIColor.lightGray, 
            NSAttributedStringKey.font: AttriFont])

Xcode 10, iOS 12, Swift 4 :

let attriString = NSAttributedString(string:"attriString", attributes:
[NSAttributedString.Key.foregroundColor: UIColor.lightGray, 
            NSAttributedString.Key.font: AttriFont])
harthoo
sumber
20

Swift 4:

let attributes = [NSAttributedStringKey.font: UIFont(name: "HelveticaNeue-Bold", size: 17)!, 
                  NSAttributedStringKey.foregroundColor: UIColor.white]
Adam Bardon
sumber
itu tidak dikompilasiType 'NSAttributedStringKey' (aka 'NSString') has no member 'font'
bibscy
Saya baru saja mencobanya di XCode terbaru (10 beta 6) dan kompilasi, apakah Anda yakin Anda menggunakan Swift 4?
Adam Bardon
Saya menggunakan Swift 3
bibscy
4
Nah itu masalahnya, jawaban saya memiliki judul tebal "Swift 4", saya sangat menyarankan Anda memperbarui ke Swift 4
Adam Bardon
@bibscy Anda dapat menggunakan NSAttributedString.Key. ***
Hatim
19

Saya akan sangat merekomendasikan menggunakan perpustakaan untuk string yang dikaitkan. Ini membuatnya lebih mudah ketika Anda ingin, misalnya, satu string dengan empat warna berbeda dan empat font berbeda. Ini favorit saya. Ini disebut SwiftyAttributes

Jika Anda ingin membuat string dengan empat warna dan font berbeda menggunakan SwiftyAttributes:

let magenta = "Hello ".withAttributes([
    .textColor(.magenta),
    .font(.systemFont(ofSize: 15.0))
    ])
let cyan = "Sir ".withAttributes([
    .textColor(.cyan),
    .font(.boldSystemFont(ofSize: 15.0))
    ])
let green = "Lancelot".withAttributes([
    .textColor(.green),
    .font(.italicSystemFont(ofSize: 15.0))

    ])
let blue = "!".withAttributes([
    .textColor(.blue),
    .font(.preferredFont(forTextStyle: UIFontTextStyle.headline))

    ])
let finalString = magenta + cyan + green + blue

finalString akan ditampilkan sebagai

Ditampilkan sebagai gambar

MendyK
sumber
15

Swift: xcode 6.1

    let font:UIFont? = UIFont(name: "Arial", size: 12.0)

    let attrString = NSAttributedString(
        string: titleData,
        attributes: NSDictionary(
            object: font!,
            forKey: NSFontAttributeName))
Vinod Joshi
sumber
10

Cara terbaik untuk mendekati Attributed Strings di iOS adalah dengan menggunakan built-in Attributed Text editor di pembuat antarmuka dan menghindari hardcoding NSAtrributedStringKeys yang tidak diperlukan dalam file sumber Anda.

Anda nanti dapat secara dinamis mengganti placehoderls saat runtime dengan menggunakan ekstensi ini:

extension NSAttributedString {
    func replacing(placeholder:String, with valueString:String) -> NSAttributedString {

        if let range = self.string.range(of:placeholder) {
            let nsRange = NSRange(range,in:valueString)
            let mutableText = NSMutableAttributedString(attributedString: self)
            mutableText.replaceCharacters(in: nsRange, with: valueString)
            return mutableText as NSAttributedString
        }
        return self
    }
}

Tambahkan label papan cerita dengan teks yang dikaitkan tampak seperti ini.

masukkan deskripsi gambar di sini

Maka Anda cukup memperbarui nilai setiap kali Anda perlu seperti ini:

label.attributedText = initalAttributedString.replacing(placeholder: "<price>", with: newValue)

Pastikan untuk menyimpan ke initalAttributedString nilai asli.

Anda dapat lebih memahami pendekatan ini dengan membaca artikel ini: https://medium.com/mobile-appetite/text-attributes-on-ios-the-effortless-approach-ff086588173e

Efraim
sumber
Ini sangat membantu untuk kasus saya, di mana saya memiliki Storyboard dan hanya ingin menambahkan huruf tebal ke bagian string dalam label. Jauh lebih sederhana daripada mengatur semua atribut secara manual.
Marc Attinasi
Ekstensi ini dulunya bekerja untuk saya dengan sempurna, tetapi di Xcode 11 itu membuat aplikasi saya mogok let nsRange = NSRange(range,in:valueString).
Lucas P.
9

Swift 2.0

Berikut ini contohnya:

let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleDouble.rawValue], range: NSMakeRange(4, 4))
sampleLabel.attributedText = newsString.copy() as? NSAttributedString

Swift 5.x

let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
newsString.addAttributes([NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue], range: NSMakeRange(4, 4))
sampleLabel.attributedText = newsString.copy() as? NSAttributedString

ATAU

let stringAttributes = [
    NSFontAttributeName : UIFont(name: "Helvetica Neue", size: 17.0)!,
    NSUnderlineStyleAttributeName : 1,
    NSForegroundColorAttributeName : UIColor.orangeColor(),
    NSTextEffectAttributeName : NSTextEffectLetterpressStyle,
    NSStrokeWidthAttributeName : 2.0]
let atrributedString = NSAttributedString(string: "Sample String: Attributed", attributes: stringAttributes)
sampleLabel.attributedText = atrributedString
AG
sumber
8

Bekerja dengan baik di beta 6

let attrString = NSAttributedString(
    string: "title-title-title",
    attributes: NSDictionary(
       object: NSFont(name: "Arial", size: 12.0), 
       forKey: NSFontAttributeName))
Andrey
sumber
7

Saya membuat alat online yang akan menyelesaikan masalah Anda! Anda dapat menulis string dan menerapkan gaya grafis dan alat memberi Anda kode obyektif-c dan cepat untuk menghasilkan string itu.

Juga merupakan open source, jadi jangan ragu untuk memperpanjang dan mengirim PR.

Alat Transformer

Github

masukkan deskripsi gambar di sini

Andres
sumber
Tidak bekerja untukku. Itu hanya membungkus semuanya dalam tanda kurung tanpa menerapkan gaya apa pun.
Daniel Springer
6

Cepat 5 dan lebih tinggi

   let attributedString = NSAttributedString(string:"targetString",
                                   attributes:[NSAttributedString.Key.foregroundColor: UIColor.lightGray,
                                               NSAttributedString.Key.font: UIFont(name: "Arial", size: 18.0) as Any])
midhun p
sumber
5
func decorateText(sub:String, des:String)->NSAttributedString{
    let textAttributesOne = [NSAttributedStringKey.foregroundColor: UIColor.darkText, NSAttributedStringKey.font: UIFont(name: "PTSans-Bold", size: 17.0)!]
    let textAttributesTwo = [NSAttributedStringKey.foregroundColor: UIColor.black, NSAttributedStringKey.font: UIFont(name: "PTSans-Regular", size: 14.0)!]

    let textPartOne = NSMutableAttributedString(string: sub, attributes: textAttributesOne)
    let textPartTwo = NSMutableAttributedString(string: des, attributes: textAttributesTwo)

    let textCombination = NSMutableAttributedString()
    textCombination.append(textPartOne)
    textCombination.append(textPartTwo)
    return textCombination
}

//Penerapan

cell.lblFrom.attributedText = decorateText(sub: sender!, des: " - \(convertDateFormatShort3(myDateString: datetime!))")
Yogesh Tandel
sumber
4

Cepat 4

let attributes = [NSAttributedStringKey.font : UIFont(name: CustomFont.NAME_REGULAR.rawValue, size: CustomFontSize.SURVEY_FORM_LABEL_SIZE.rawValue)!]

let attributedString : NSAttributedString = NSAttributedString(string: messageString, attributes: attributes)

Anda harus menghapus nilai mentah di swift 4

Neha
sumber
3

Bagi saya solusi di atas tidak berfungsi saat mengatur warna atau properti tertentu.

Ini berhasil:

let attributes = [
    NSFontAttributeName : UIFont(name: "Helvetica Neue", size: 12.0)!,
    NSUnderlineStyleAttributeName : 1,
    NSForegroundColorAttributeName : UIColor.darkGrayColor(),
    NSTextEffectAttributeName : NSTextEffectLetterpressStyle,
    NSStrokeWidthAttributeName : 3.0]

var atriString = NSAttributedString(string: "My Attributed String", attributes: attributes)
swennemen
sumber
3

Swift 2.1 - Xcode 7

let labelFont = UIFont(name: "HelveticaNeue-Bold", size: 18)
let attributes :[String:AnyObject] = [NSFontAttributeName : labelFont!]
let attrString = NSAttributedString(string:"foo", attributes: attributes)
myLabel.attributedText = attrString
Alessandro Ornano
sumber
Perubahan apa yang dibuat antara Swift 2.0 dan 2.1?
Suragch
3

Gunakan kode contoh ini. Ini adalah kode yang sangat singkat untuk mencapai kebutuhan Anda. Ini bekerja untuk saya.

let attributes = [NSAttributedStringKey.font : UIFont(name: CustomFont.NAME_REGULAR.rawValue, size: CustomFontSize.SURVEY_FORM_LABEL_SIZE.rawValue)!]

let attributedString : NSAttributedString = NSAttributedString(string: messageString, attributes: attributes)
VipinYadav
sumber
2
extension UILabel{
    func setSubTextColor(pSubString : String, pColor : UIColor){    
        let attributedString: NSMutableAttributedString = self.attributedText != nil ? NSMutableAttributedString(attributedString: self.attributedText!) : NSMutableAttributedString(string: self.text!);

        let range = attributedString.mutableString.range(of: pSubString, options:NSString.CompareOptions.caseInsensitive)
        if range.location != NSNotFound {
            attributedString.addAttribute(NSForegroundColorAttributeName, value: pColor, range: range);
        }
        self.attributedText = attributedString
    }
}
Dipak Panchasara
sumber
cell.IBLabelGuestAppointmentTime.text = "\ n \ nGuest1 \ n8: 00 am \ n \ nGuest2 \ n9: 00Am \ n \ n" cell.IBLabelGuestAppointmentTime.setSubTextColor (pSubString: "Guest1", pColor colorCustom color. .setSubTextColor (pSubString: "Guest2", pColor: UIColor.red)
Dipak Panchasara
1
Selamat datang di SO. Harap format kode Anda, dan tambahkan beberapa penjelasan / konteks untuk jawaban Anda. Lihat: stackoverflow.com/help/how-to-answer
Uwe Allner
2

Atribut dapat diatur langsung dalam 3 ...

    let attributes = NSAttributedString(string: "String", attributes: [NSFontAttributeName : UIFont(name: "AvenirNext-Medium", size: 30)!,
         NSForegroundColorAttributeName : UIColor .white,
         NSTextEffectAttributeName : NSTextEffectLetterpressStyle])

Kemudian gunakan variabel di kelas apa pun dengan atribut

Sebastian
sumber
2

Cepat 4.2

extension UILabel {

    func boldSubstring(_ substr: String) {
        guard substr.isEmpty == false,
            let text = attributedText,
            let range = text.string.range(of: substr, options: .caseInsensitive) else {
                return
        }
        let attr = NSMutableAttributedString(attributedString: text)
        let start = text.string.distance(from: text.string.startIndex, to: range.lowerBound)
        let length = text.string.distance(from: range.lowerBound, to: range.upperBound)
        attr.addAttributes([NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: self.font.pointSize)],
                           range: NSMakeRange(start, length))
        attributedText = attr
    }
}
Debaprio B
sumber
Mengapa tidak hanya range.count untuk panjangnya?
Leo Dabus
2

Detail

  • Swift 5.2, Xcode 11.4 (11E146)

Larutan

protocol AttributedStringComponent {
    var text: String { get }
    func getAttributes() -> [NSAttributedString.Key: Any]?
}

// MARK: String extensions

extension String: AttributedStringComponent {
    var text: String { self }
    func getAttributes() -> [NSAttributedString.Key: Any]? { return nil }
}

extension String {
    func toAttributed(with attributes: [NSAttributedString.Key: Any]?) -> NSAttributedString {
        .init(string: self, attributes: attributes)
    }
}

// MARK: NSAttributedString extensions

extension NSAttributedString: AttributedStringComponent {
    var text: String { string }

    func getAttributes() -> [Key: Any]? {
        if string.isEmpty { return nil }
        var range = NSRange(location: 0, length: string.count)
        return attributes(at: 0, effectiveRange: &range)
    }
}

extension NSAttributedString {

    convenience init?(from attributedStringComponents: [AttributedStringComponent],
                      defaultAttributes: [NSAttributedString.Key: Any],
                      joinedSeparator: String = " ") {
        switch attributedStringComponents.count {
        case 0: return nil
        default:
            var joinedString = ""
            typealias SttributedStringComponentDescriptor = ([NSAttributedString.Key: Any], NSRange)
            let sttributedStringComponents = attributedStringComponents.enumerated().flatMap { (index, component) -> [SttributedStringComponentDescriptor] in
                var components = [SttributedStringComponentDescriptor]()
                if index != 0 {
                    components.append((defaultAttributes,
                                       NSRange(location: joinedString.count, length: joinedSeparator.count)))
                    joinedString += joinedSeparator
                }
                components.append((component.getAttributes() ?? defaultAttributes,
                                   NSRange(location: joinedString.count, length: component.text.count)))
                joinedString += component.text
                return components
            }

            let attributedString = NSMutableAttributedString(string: joinedString)
            sttributedStringComponents.forEach { attributedString.addAttributes($0, range: $1) }
            self.init(attributedString: attributedString)
        }
    }
}

Pemakaian

let defaultAttributes = [
    .font: UIFont.systemFont(ofSize: 16, weight: .regular),
    .foregroundColor: UIColor.blue
] as [NSAttributedString.Key : Any]

let marketingAttributes = [
    .font: UIFont.systemFont(ofSize: 20.0, weight: .bold),
    .foregroundColor: UIColor.black
] as [NSAttributedString.Key : Any]

let attributedStringComponents = [
    "pay for",
    NSAttributedString(string: "one",
                       attributes: marketingAttributes),
    "and get",
    "three!\n".toAttributed(with: marketingAttributes),
    "Only today!".toAttributed(with: [
        .font: UIFont.systemFont(ofSize: 16.0, weight: .bold),
        .foregroundColor: UIColor.red
    ])
] as [AttributedStringComponent]
let attributedText = NSAttributedString(from: attributedStringComponents, defaultAttributes: defaultAttributes)

Contoh Lengkap

jangan lupa tempel kode solusi di sini

import UIKit

class ViewController: UIViewController {

    private weak var label: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        let label = UILabel(frame: .init(x: 40, y: 40, width: 300, height: 80))
        label.numberOfLines = 2
        view.addSubview(label)
        self.label = label

        let defaultAttributes = [
            .font: UIFont.systemFont(ofSize: 16, weight: .regular),
            .foregroundColor: UIColor.blue
        ] as [NSAttributedString.Key : Any]

        let marketingAttributes = [
            .font: UIFont.systemFont(ofSize: 20.0, weight: .bold),
            .foregroundColor: UIColor.black
        ] as [NSAttributedString.Key : Any]

        let attributedStringComponents = [
            "pay for",
            NSAttributedString(string: "one",
                               attributes: marketingAttributes),
            "and get",
            "three!\n".toAttributed(with: marketingAttributes),
            "Only today!".toAttributed(with: [
                .font: UIFont.systemFont(ofSize: 16.0, weight: .bold),
                .foregroundColor: UIColor.red
            ])
        ] as [AttributedStringComponent]
        label.attributedText = NSAttributedString(from: attributedStringComponents, defaultAttributes: defaultAttributes)
        label.textAlignment = .center
    }
}

Hasil

masukkan deskripsi gambar di sini

Bodnarchuk dengan mudah
sumber
1

Akan sangat mudah untuk menyelesaikan masalah Anda dengan perpustakaan yang saya buat. Itu disebut Atributika.

let calculatedCoffee: Int = 768
let g = Style("g").font(.boldSystemFont(ofSize: 12)).foregroundColor(.red)
let all = Style.font(.systemFont(ofSize: 12))

let str = "\(calculatedCoffee)<g>g</g>".style(tags: g)
    .styleAll(all)
    .attributedString

label.attributedText = str

768g

Anda dapat menemukannya di sini https://github.com/psharanda/Atributika

Pavel Sharanda
sumber
1
 let attrString = NSAttributedString (
            string: "title-title-title",
            attributes: [NSAttributedStringKey.foregroundColor: UIColor.black])
Eugene Braginets
sumber
1

Swifter Swift memiliki cara yang cukup manis untuk melakukan ini tanpa pekerjaan apa pun. Berikan saja pola yang harus dicocokkan dan atribut apa yang berlaku untuk itu. Mereka hebat untuk banyak hal memeriksanya.

``` Swift
let defaultGenreText = NSAttributedString(string: "Select Genre - Required")
let redGenreText = defaultGenreText.applying(attributes: [NSAttributedString.Key.foregroundColor : UIColor.red], toRangesMatching: "Required")
``

Jika Anda memiliki banyak tempat di mana ini akan diterapkan dan Anda hanya ingin itu terjadi untuk contoh tertentu maka metode ini tidak akan berfungsi.

Anda dapat melakukan ini dalam satu langkah, hanya lebih mudah dibaca ketika dipisahkan.

Vrezh Gulyan
sumber
0

Swift 4.x

let attr = [NSForegroundColorAttributeName:self.configuration.settingsColor, NSFontAttributeName: self.configuration.settingsFont]

let title = NSAttributedString(string: self.configuration.settingsTitle,
                               attributes: attr)
Arunabh Das
sumber
0

Swift 3.0 // membuat string yang dikaitkan

Tentukan atribut like

let attributes = [NSAttributedStringKey.font : UIFont.init(name: "Avenir-Medium", size: 13.0)]
Pengembang iOS
sumber
0

Silakan pertimbangkan menggunakan Prestyler

import Prestyler
...
Prestyle.defineRule("$", UIColor.red)
label.attributedText = "\(calculatedCoffee) $g$".prestyled()
Kruiller
sumber
0

Cepat 5

    let attrStri = NSMutableAttributedString.init(string:"This is red")
    let nsRange = NSString(string: "This is red").range(of: "red", options: String.CompareOptions.caseInsensitive)
    attrStri.addAttributes([NSAttributedString.Key.foregroundColor : UIColor.red, NSAttributedString.Key.font: UIFont.init(name: "PTSans-Regular", size: 15.0) as Any], range: nsRange)
    self.label.attributedText = attrStri

masukkan deskripsi gambar di sini

Gurjinder Singh
sumber
-4
extension String {
//MARK: Getting customized string
struct StringAttribute {
    var fontName = "HelveticaNeue-Bold"
    var fontSize: CGFloat?
    var initialIndexOftheText = 0
    var lastIndexOftheText: Int?
    var textColor: UIColor = .black
    var backGroundColor: UIColor = .clear
    var underLineStyle: NSUnderlineStyle = .styleNone
    var textShadow: TextShadow = TextShadow()

    var fontOfText: UIFont {
        if let font = UIFont(name: fontName, size: fontSize!) {
            return font
        } else {
            return UIFont(name: "HelveticaNeue-Bold", size: fontSize!)!
        }
    }

    struct TextShadow {
        var shadowBlurRadius = 0
        var shadowOffsetSize = CGSize(width: 0, height: 0)
        var shadowColor: UIColor = .clear
    }
}
func getFontifiedText(partOfTheStringNeedToConvert partTexts: [StringAttribute]) -> NSAttributedString {
    let fontChangedtext = NSMutableAttributedString(string: self, attributes: [NSFontAttributeName: UIFont(name: "HelveticaNeue-Bold", size: (partTexts.first?.fontSize)!)!])
    for eachPartText in partTexts {
        let lastIndex = eachPartText.lastIndexOftheText ?? self.count
        let attrs = [NSFontAttributeName : eachPartText.fontOfText, NSForegroundColorAttributeName: eachPartText.textColor, NSBackgroundColorAttributeName: eachPartText.backGroundColor, NSUnderlineStyleAttributeName: eachPartText.underLineStyle, NSShadowAttributeName: eachPartText.textShadow ] as [String : Any]
        let range = NSRange(location: eachPartText.initialIndexOftheText, length: lastIndex - eachPartText.initialIndexOftheText)
        fontChangedtext.addAttributes(attrs, range: range)
    }
    return fontChangedtext
}

}

// Gunakan seperti di bawah ini

    let someAttributedText = "Some   Text".getFontifiedText(partOfTheStringNeedToConvert: <#T##[String.StringAttribute]#>)
Manas Mishra
sumber
2
jawaban ini memberi tahu Anda segala sesuatu yang perlu Anda ketahui kecuali cara membuat string yang dikaitkan dengan cepat.
Eric