Teks Tebal & Tidak Tebal dalam UILabel Tunggal?

254

Bagaimana mungkin memasukkan teks tebal dan tidak tebal dalam uiLabel?

Saya lebih suka tidak menggunakan UIWebView .. Saya juga sudah membaca ini mungkin dapat menggunakan NSAttributedString tapi saya tidak tahu cara menggunakannya. Ada ide?

Apple mencapai ini di beberapa aplikasi mereka; Contoh Screenshot:teks tautan

Terima kasih! - Dom

DomMaiocchi
sumber
Lihatlah topik ini dari Stack Overflow sebelumnya. (Pada dasarnya, buat dua UILabel dan posisikan dengan benar relatif satu sama lain.)
samkass

Jawaban:

360

Memperbarui

Di Swift kita tidak harus berurusan dengan hal-hal lama iOS5 selain sintaks lebih pendek sehingga semuanya menjadi sangat sederhana:

Cepat 5

func attributedString(from string: String, nonBoldRange: NSRange?) -> NSAttributedString {
    let fontSize = UIFont.systemFontSize
    let attrs = [
        NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: fontSize),
        NSAttributedString.Key.foregroundColor: UIColor.black
    ]
    let nonBoldAttribute = [
        NSAttributedString.Key.font: UIFont.systemFont(ofSize: fontSize),
    ]
    let attrStr = NSMutableAttributedString(string: string, attributes: attrs)
    if let range = nonBoldRange {
        attrStr.setAttributes(nonBoldAttribute, range: range)
    }
    return attrStr
}

Cepat 3

func attributedString(from string: String, nonBoldRange: NSRange?) -> NSAttributedString {
    let fontSize = UIFont.systemFontSize
    let attrs = [
        NSFontAttributeName: UIFont.boldSystemFont(ofSize: fontSize),
        NSForegroundColorAttributeName: UIColor.black
    ]
    let nonBoldAttribute = [
        NSFontAttributeName: UIFont.systemFont(ofSize: fontSize),
    ]
    let attrStr = NSMutableAttributedString(string: string, attributes: attrs)
    if let range = nonBoldRange {
        attrStr.setAttributes(nonBoldAttribute, range: range)
    }
    return attrStr
}

Pemakaian:

let targetString = "Updated 2012/10/14 21:59 PM"
let range = NSMakeRange(7, 12)

let label = UILabel(frame: CGRect(x:0, y:0, width:350, height:44))
label.backgroundColor = UIColor.white
label.attributedText = attributedString(from: targetString, nonBoldRange: range)
label.sizeToFit()

Bonus: Internasionalisasi

Beberapa orang berkomentar tentang internasionalisasi. Saya pribadi berpikir ini di luar ruang lingkup pertanyaan ini, tetapi untuk tujuan pengajaran ini adalah bagaimana saya akan melakukannya

// Date we want to show
let date = Date()

// Create the string.
// I don't set the locale because the default locale of the formatter is `NSLocale.current` so it's good for internationalisation :p
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
let targetString = String(format: NSLocalizedString("Update %@", comment: "Updated string format"),
                          formatter.string(from: date))

// Find the range of the non-bold part
formatter.timeStyle = .none
let nonBoldRange = targetString.range(of: formatter.string(from: date))

// Convert Range<Int> into NSRange
let nonBoldNSRange: NSRange? = nonBoldRange == nil ?
    nil :
    NSMakeRange(targetString.distance(from: targetString.startIndex, to: nonBoldRange!.lowerBound),
                targetString.distance(from: nonBoldRange!.lowerBound, to: nonBoldRange!.upperBound))

// Now just build the attributed string as before :)
label.attributedText = attributedString(from: targetString,
                                        nonBoldRange: nonBoldNSRange)

Hasil (Dengan asumsi Bahasa Inggris dan Jepang Localizable.strings tersedia)

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini


Jawaban sebelumnya untuk iOS6 dan yang lebih baru (Objective-C masih berfungsi):

Di iOS6 UILabel, UIButton, UITextView, UITextField, dukungan dikaitkan string yang berarti kita tidak perlu membuat CATextLayersebagai penerima kami untuk string dikaitkan. Selanjutnya untuk membuat string yang dikaitkan kita tidak perlu bermain dengan CoreText lagi :) Kami memiliki kelas-kelas baru di obj-c Foundation.framework like NSParagraphStyledan konstanta lain yang akan membuat hidup kita lebih mudah. Yay!

Jadi, jika kita memiliki string ini:

NSString *text = @"Updated: 2012/10/14 21:59"

Kami hanya perlu membuat string yang dikaitkan:

if ([_label respondsToSelector:@selector(setAttributedText:)])
{
    // iOS6 and above : Use NSAttributedStrings

    // Create the attributes
    const CGFloat fontSize = 13;
    NSDictionary *attrs = @{
        NSFontAttributeName:[UIFont boldSystemFontOfSize:fontSize],
        NSForegroundColorAttributeName:[UIColor whiteColor]
    };
    NSDictionary *subAttrs = @{
        NSFontAttributeName:[UIFont systemFontOfSize:fontSize]
    };

    // Range of " 2012/10/14 " is (8,12). Ideally it shouldn't be hardcoded
    // This example is about attributed strings in one label
    // not about internationalisation, so we keep it simple :)
    // For internationalisation example see above code in swift
    const NSRange range = NSMakeRange(8,12);

    // Create the attributed string (text + attributes)
    NSMutableAttributedString *attributedText =
      [[NSMutableAttributedString alloc] initWithString:text
                                             attributes:attrs];
    [attributedText setAttributes:subAttrs range:range];

    // Set it in our UILabel and we are done!
    [_label setAttributedText:attributedText];
} else {
    // iOS5 and below
    // Here we have some options too. The first one is to do something
    // less fancy and show it just as plain text without attributes.
    // The second is to use CoreText and get similar results with a bit
    // more of code. Interested people please look down the old answer.

    // Now I am just being lazy so :p
    [_label setText:text];
}

Ada beberapa posting blog pengantar yang baik di sini dari orang-orang di invasivecode yang menjelaskan dengan lebih banyak contoh penggunaan NSAttributedString, cari "Pengantar NSAttributedString untuk iOS 6" dan "string yang dikaitkan untuk iOS menggunakan Interface Builder" :)

PS: Di atas kode itu harus berfungsi tetapi itu dikompilasi otak. Semoga cukup :)


Jawaban Lama untuk iOS5 dan di bawah

Gunakan CATextLayer dengan NSAttributedString! jauh lebih ringan dan lebih sederhana dari 2 UILabel. (iOS 3.2 dan lebih tinggi)

Contoh.

Jangan lupa untuk menambahkan kerangka kerja QuartzCore (diperlukan untuk CALayers), dan CoreText (diperlukan untuk string yang dikaitkan.)

#import <QuartzCore/QuartzCore.h>
#import <CoreText/CoreText.h>

Contoh di bawah ini akan menambahkan sublayer ke bilah alat pengendali navigasi. à la Mail.app di iPhone. :)

- (void)setRefreshDate:(NSDate *)aDate
{
    [aDate retain];
    [refreshDate release];
    refreshDate = aDate;

    if (refreshDate) {

        /* Create the text for the text layer*/    
        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        [df setDateFormat:@"MM/dd/yyyy hh:mm"];

        NSString *dateString = [df stringFromDate:refreshDate];
        NSString *prefix = NSLocalizedString(@"Updated", nil);
        NSString *text = [NSString stringWithFormat:@"%@: %@",prefix, dateString];
        [df release];

        /* Create the text layer on demand */
        if (!_textLayer) {
            _textLayer = [[CATextLayer alloc] init];
            //_textLayer.font = [UIFont boldSystemFontOfSize:13].fontName; // not needed since `string` property will be an NSAttributedString
            _textLayer.backgroundColor = [UIColor clearColor].CGColor;
            _textLayer.wrapped = NO;
            CALayer *layer = self.navigationController.toolbar.layer; //self is a view controller contained by a navigation controller
            _textLayer.frame = CGRectMake((layer.bounds.size.width-180)/2 + 10, (layer.bounds.size.height-30)/2 + 10, 180, 30);
            _textLayer.contentsScale = [[UIScreen mainScreen] scale]; // looks nice in retina displays too :)
            _textLayer.alignmentMode = kCAAlignmentCenter;
            [layer addSublayer:_textLayer];
        }

        /* Create the attributes (for the attributed string) */
        CGFloat fontSize = 13;
        UIFont *boldFont = [UIFont boldSystemFontOfSize:fontSize];
        CTFontRef ctBoldFont = CTFontCreateWithName((CFStringRef)boldFont.fontName, boldFont.pointSize, NULL);
        UIFont *font = [UIFont systemFontOfSize:13];
        CTFontRef ctFont = CTFontCreateWithName((CFStringRef)font.fontName, font.pointSize, NULL);
        CGColorRef cgColor = [UIColor whiteColor].CGColor;
        NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                    (id)ctBoldFont, (id)kCTFontAttributeName,
                                    cgColor, (id)kCTForegroundColorAttributeName, nil];
        CFRelease(ctBoldFont);
        NSDictionary *subAttributes = [NSDictionary dictionaryWithObjectsAndKeys:(id)ctFont, (id)kCTFontAttributeName, nil];
        CFRelease(ctFont);

        /* Create the attributed string (text + attributes) */
        NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:text attributes:attributes];
        [attrStr addAttributes:subAttributes range:NSMakeRange(prefix.length, 12)]; //12 is the length of " MM/dd/yyyy/ "

        /* Set the attributes string in the text layer :) */
        _textLayer.string = attrStr;
        [attrStr release];

        _textLayer.opacity = 1.0;
    } else {
        _textLayer.opacity = 0.0;
        _textLayer.string = nil;
    }
}

Dalam contoh ini saya hanya memiliki dua jenis font (tebal dan normal) tetapi Anda juga bisa memiliki ukuran font yang berbeda, warna yang berbeda, miring, bergaris bawah, dll. Lihatlah NSAttributedString / NSMutableAttributedString dan CoreText atribut kunci kunci string .

Semoga ini bisa membantu

nacho4d
sumber
2
Sayangnya, ini (dan jawaban lainnya) tidak ramah untuk Internasionalisasi. Dukungan tag html (<b>, <i>) seperti di Android sudah bagus.
Victor G
1
Karena ini adalah contoh saya lebih suka untuk tidak menangani hal itu. Jika Anda memerlukan pelokalan, Anda bisa mendapatkan komponen tanggal dari NSDate dan menemukan rentang bold / non-bold yang sesuai secara pemrograman (alih-alih mengkodekan rentang, Ada komentar dalam kode di atas yang menyebutkan bahwa hardcoding tidak ideal)
nacho4d
1
Anda sebaiknya mempertimbangkan penggunaan Objective-C literal yang lebih mudah dibaca dalam kode Anda. Misalnya [NSDictionary dictionaryWithObjectsAndKeys: boldFont, NSFontAttributeName, foregroundColor, NSForegroundColorAttributeName, nil]menjadi @{ NSFontAttributeName: boldFont, NSForegroundColorAttributeName: foregroundColor }.
PatrickNLT
@ nacho4d Hebat! Tetapi ada salah ketik: sintaksis membutuhkan kurung keriting ( {), bukan kurung siku ( [).
PatrickNLT
Saya telah menambahkan beberapa kode yang menunjukkan pendekatan ramah internasionalisasi
nacho4d
85

Coba kategori di UILabel:

Begini cara menggunakannya:

myLabel.text = @"Updated: 2012/10/14 21:59 PM";
[myLabel boldSubstring: @"Updated:"];
[myLabel boldSubstring: @"21:59 PM"];

Dan inilah kategorinya

UILabel + Boldify.h

- (void) boldSubstring: (NSString*) substring;
- (void) boldRange: (NSRange) range;

UILabel + Boldify.m

- (void) boldRange: (NSRange) range {
    if (![self respondsToSelector:@selector(setAttributedText:)]) {
        return;
    }
    NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithAttributedString:self.attributedText];
    [attributedText setAttributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:self.font.pointSize]} range:range];

    self.attributedText = attributedText;    
}

- (void) boldSubstring: (NSString*) substring {
    NSRange range = [self.text rangeOfString:substring];
    [self boldRange:range];
}

Perhatikan bahwa ini hanya akan berfungsi di iOS 6 dan yang lebih baru. Itu hanya akan diabaikan di iOS 5 dan sebelumnya.

bbrame
sumber
2
Kategori bagus Meskipun itu tidak akan membuat huruf tebal. Untuk melakukannya, Anda seharusnya membuatnya seperti itu: @{NSFontAttributeName:[UIFont boldSystemFontOfSize:self.font.pointSize]}Saya
terbalik
1
Jika font label Anda bukan font sistem, maka perlu mengubah: [UIFont boldSystemFontOfSize:self.font.pointSize]TO[UIFont fontWithName:self.font.fontName size:self.font.pointSize]
lee
48

Itu mudah dilakukan di Interface Builder :

1) membuat UILabel Dikaitkan di Atribut Inspektur

Contoh Tebal Langkah 1

2) pilih bagian kalimat yang ingin Anda buat tebal

Contoh Tebal Langkah 2

3) ubah fontnya (atau huruf tebal dari font yang sama) di pemilih font

Contoh Tebal Langkah 3

Itu saja!

Anton Gaenko
sumber
Sepertinya Anda hanya dapat melakukan ini untuk huruf tebal (dan jenis font lainnya), bukan untuk menerapkan atribut lain seperti garis bawah? (meskipun pemetik font memiliki itu, garis bawah diklik untuk saya). Anda melihat perilaku yang sama?
pj4533
2
Sepertinya, itu baik untuk teks statis, lagipula saya tidak tahu ini sebelum membaca posting ini.
preetam
Kekhawatiran saya dengan fitur Pembuat Antarmuka baru ini adalah Anda harus memilih font khusus tertentu, bukan font sistem lagi sehingga akan kehilangan semua implementasi sistem untuk orang / aksesibilitas sebagian?
Litome
1
Saya telah membuat beberapa bagian dari teks saya tebal dan menunjukkan bagaimana seharusnya di inspektur atribut tetapi tidak di simulator atau bahkan di storyboard.
Besat
45

Ada kategori berdasarkan kategori bbrame. Ini berfungsi serupa, tetapi memungkinkan Anda untuk mencetak tebal yang samaUILabel beberapa kali dengan hasil kumulatif yang sama.

UILabel + Boldify.h

@interface UILabel (Boldify)
- (void) boldSubstring: (NSString*) substring;
- (void) boldRange: (NSRange) range;
@end

UILabel + Boldify.m

@implementation UILabel (Boldify)
- (void)boldRange:(NSRange)range {
    if (![self respondsToSelector:@selector(setAttributedText:)]) {
        return;
    }
    NSMutableAttributedString *attributedText;
    if (!self.attributedText) {
        attributedText = [[NSMutableAttributedString alloc] initWithString:self.text];
    } else {
        attributedText = [[NSMutableAttributedString alloc] initWithAttributedString:self.attributedText];
    }
    [attributedText setAttributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:self.font.pointSize]} range:range];
    self.attributedText = attributedText;
}

- (void)boldSubstring:(NSString*)substring {
    NSRange range = [self.text rangeOfString:substring];
    [self boldRange:range];
}
@end

Dengan koreksi ini Anda dapat menggunakannya beberapa kali, misalnya:

myLabel.text = @"Updated: 2012/10/14 21:59 PM";
[myLabel boldSubstring: @"Updated:"];
[myLabel boldSubstring: @"21:59 PM"];

akan muncul dengan: " Diperbarui: 2012/10/14 21:59 PM ".

Yoghurt Gila
sumber
Gila itu akan menebalkan substring terakhir hanya yaitu 21:59 PM.
Prajeet Shrestha
Saya telah mengujinya tahun lalu dan sepertinya berhasil saat itu. Inti dari posting saya adalah mengubah kategori bbrame untuk menangani banyak huruf tebal. Saya tidak dapat melakukan ini saat ini, tetapi dalam dua minggu saya akan menguji ulang kode ini untuk memastikan kode itu berfungsi.
Crazy Yoghurt
Gila cek jawabanku di bawah ini tlg. Dan tolong sarankan cara membuatnya bisa digunakan kembali.
Prajeet Shrestha
27

Ini bekerja untuk saya:

CGFloat boldTextFontSize = 17.0f;

myLabel.text = [NSString stringWithFormat:@"%@ 2012/10/14 %@",@"Updated:",@"21:59 PM"];

NSRange range1 = [myLabel.text rangeOfString:@"Updated:"];
NSRange range2 = [myLabel.text rangeOfString:@"21:59 PM"];

NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:myLabel.text];

[attributedText setAttributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:boldTextFontSize]}
                        range:range1];
[attributedText setAttributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:boldTextFontSize]}
                        range:range2];

myLabel.attributedText = attributedText;

Untuk versi Swift: Lihat Di Sini

Prajeet Shrestha
sumber
cantik dan sederhana! Terima kasih!
Mona
25

Saya sudah mengadopsi jawaban Crazy Yoghurt untuk ekstensi swift.

extension UILabel {

    func boldRange(_ range: Range<String.Index>) {
        if let text = self.attributedText {
            let attr = NSMutableAttributedString(attributedString: text)
            let start = text.string.characters.distance(from: text.string.startIndex, to: range.lowerBound)
            let length = text.string.characters.distance(from: range.lowerBound, to: range.upperBound)
            attr.addAttributes([NSFontAttributeName: UIFont.boldSystemFont(ofSize: self.font.pointSize)], range: NSMakeRange(start, length))
            self.attributedText = attr
        }
    }

    func boldSubstring(_ substr: String) {
        if let text = self.attributedText {
            var range = text.string.range(of: substr)
            let attr = NSMutableAttributedString(attributedString: text)
            while range != nil {
                let start = text.string.characters.distance(from: text.string.startIndex, to: range!.lowerBound)
                let length = text.string.characters.distance(from: range!.lowerBound, to: range!.upperBound)
                var nsRange = NSMakeRange(start, length)
                let font = attr.attribute(NSFontAttributeName, at: start, effectiveRange: &nsRange) as! UIFont
                if !font.fontDescriptor.symbolicTraits.contains(.traitBold) {
                    break
                }
                range = text.string.range(of: substr, options: NSString.CompareOptions.literal, range: range!.upperBound..<text.string.endIndex, locale: nil)
            }
            if let r = range {
                boldRange(r)
            }
        }
    }
}

Mungkin tidak ada konversi yang baik antara Range dan NSRange, tetapi saya tidak menemukan sesuatu yang lebih baik.

Artem Mostyaev
sumber
1
Terima kasih banyak! Apa yang saya butuhkan! Saya mengubah baris kedua di boldSubstring(_:)untuk var range = text.string.range(of: substr, options: .caseInsensitive)ke string make dengan kapitalisasi yang berbeda juga berani.
fl034
21

Lihat TTTAttributedLabel . Ini adalah pengganti drop-in untuk UILabel yang memungkinkan Anda untuk memadukan font dan warna dalam satu label dengan menetapkan NSAttributedString sebagai teks untuk label tersebut.

mattt
sumber
5
Harus setuju dengan menggunakan setetes penggantian (ada beberapa sekitar). Apple belum menyelesaikan pekerjaan mereka untuk hal ini. Selain sebagai latihan akademis saya tidak berpikir itu benar-benar layak untuk mencoba memahami dan menerapkan kekacauan ini - mungkin semua akan dirapikan dengan baik dalam rilis berikutnya (atau lebih). :) github.com/AliSoftware/OHAttributedLabel
penjebak
@ perangkap - Anda menghemat hari saya dengan tautan ini ... +1000!
Bebek
Saya juga merekomendasikan OHAttributedLabel juga. Anda dapat menggunakan tag HTML seperti <b> dan <u> (dan lainnya) tepat di string.
RyanG
12

Dalam hal ini Anda bisa mencoba,

UILabel *displayLabel = [[UILabel alloc] initWithFrame:/*label frame*/];
displayLabel.font = [UIFont boldSystemFontOfSize:/*bold font size*/];

NSMutableAttributedString *notifyingStr = [[NSMutableAttributedString alloc] initWithString:@"Updated: 2012/10/14 21:59 PM"];
[notifyingStr beginEditing];
[notifyingStr addAttribute:NSFontAttributeName
                     value:[UIFont systemFontOfSize:/*normal font size*/]
                     range:NSMakeRange(8,10)/*range of normal string, e.g. 2012/10/14*/];
[notifyingStr endEditing];

displayLabel.attributedText = notifyingStr; // or [displayLabel setAttributedText: notifyingStr];
x4h1d
sumber
PS Tetapkan nilai pada label terlebih dahulu (mis. DisplayLabel.text = @ "Diperbarui: 2013/12/23 21:59 PM";)
Mazen Kasser
8

Untuk membuat teks tebal dan menggarisbawahi dalam UILabel. Cukup tambahkan baris berikut dalam kode Anda.

NSRange range1 = [lblTermsAndCondition.text rangeOfString:NSLocalizedString(@"bold_terms", @"")];
NSRange range2 = [lblTermsAndCondition.text rangeOfString:NSLocalizedString(@"bold_policy", @"")];
NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:lblTermsAndCondition.text];
[attributedText setAttributes:@{NSFontAttributeName:[UIFont fontWithName:fontBold size:12.0]}
                        range:range1];
[attributedText setAttributes:@{NSFontAttributeName:[UIFont fontWithName:fontBold size:12.0]}
                        range:range2];


[attributedText addAttribute:(NSString*)kCTUnderlineStyleAttributeName
                  value:[NSNumber numberWithInt:kCTUnderlineStyleSingle]
                  range:range1];

[attributedText addAttribute:(NSString*)kCTUnderlineStyleAttributeName
                       value:[NSNumber numberWithInt:kCTUnderlineStyleSingle]
                       range:range2];



lblTermsAndCondition.attributedText = attributedText;
Ankit Goyal
sumber
5

Gunakan kode di bawah ini. Saya harap ini membantu Anda.

NSString *needToChangeStr=@"BOOK";
NSString *display_string=[NSString stringWithFormat:@"This is %@",book];

NSMutableAttributedString *attri_str=[[NSMutableAttributedString alloc]initWithString:display_string];

int begin=[display_string length]-[needToChangeStr length];
int end=[needToChangeStr length];


[attri_str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"HelveticaNeue-Bold" size:30] range:NSMakeRange(begin, end)];

sumber
4

Swift 4:

// attribute with color red and Bold
var attrs1 = [NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 20), NSAttributedStringKey.foregroundColor: UIColor.red]

// attribute with color black and Non Bold
var attrs2 = [NSAttributedStringKey.font: UIFont(name: "Roboto-Regular", size: 20), NSAttributedStringKey.foregroundColor: UIColor.black]  

var color1 = NSAttributedString(string: "RED", attributes: attrs1)

var color2 = NSAttributedString(string: " BLACK", attributes: attrs2)

var string = NSMutableAttributedString()

string.append(color1)

string.append(color2)

// print the text with **RED** BLACK
print("Final String : \(string)")
Vinu Jacob
sumber
3

Semoga yang ini memenuhi kebutuhan Anda. Berikan string untuk diproses sebagai input dan berikan kata-kata yang harus dicetak tebal / berwarna sebagai input.

func attributedString(parentString:String, arrayOfStringToProcess:[String], color:UIColor) -> NSAttributedString
{
    let parentAttributedString = NSMutableAttributedString(string:parentString, attributes:nil)
    let parentStringWords = parentAttributedString.string.components(separatedBy: " ")
    if parentStringWords.count != 0
    {
        let wordSearchArray = arrayOfStringToProcess.filter { inputArrayIndex in
            parentStringWords.contains(where: { $0 == inputArrayIndex }
            )}
        for eachWord in wordSearchArray
        {
            parentString.enumerateSubstrings(in: parentString.startIndex..<parentString.endIndex, options: .byWords)
            {
                (substring, substringRange, _, _) in
                if substring == eachWord
                {
                    parentAttributedString.addAttribute(.font, value: UIFont.boldSystemFont(ofSize: 15), range: NSRange(substringRange, in: parentString))
                    parentAttributedString.addAttribute(.foregroundColor, value: color, range: NSRange(substringRange, in: parentString))
                }
            }
        }
    }
    return parentAttributedString
}

Terima kasih. Selamat Coding.

Alex
sumber
2

Tidak perlu untuk NSRange dengan kode berikut yang baru saja saya terapkan dalam proyek saya (dalam Swift):

    //Code sets label (yourLabel)'s text to "Tap and hold(BOLD) button to start recording."
    let boldAttribute = [
        //You can add as many attributes as you want here.
        NSFontAttributeName: UIFont(name: "HelveticaNeue-Bold", size: 18.0)!]

    let regularAttribute = [
        NSFontAttributeName: UIFont(name: "HelveticaNeue-Light", size: 18.0)!]

    let beginningAttributedString = NSAttributedString(string: "Tap and ", attributes: regularAttribute )
    let boldAttributedString = NSAttributedString(string: "hold ", attributes: boldAttribute)
    let endAttributedString = NSAttributedString(string: "button to start recording.", attributes: regularAttribute )
    let fullString =  NSMutableAttributedString()

    fullString.appendAttributedString(beginningAttributedString)
    fullString.appendAttributedString(boldAttributedString)
    fullString.appendAttributedString(endAttributedString)

    yourLabel.attributedText = fullString
Josh O'Connor
sumber