ข้อความตัวหนาและไม่เป็นตัวหนาใน UILabel เดียว?


254

เป็นไปได้อย่างไรที่จะรวมทั้งตัวหนาและตัวหนาใน uiLabel

ฉันไม่ควรใช้ UIWebView .. ฉันอ่านแล้วอาจเป็นไปได้โดยใช้ NSAttributedString แต่ฉันไม่รู้ว่าจะใช้ยังไง ความคิดใด ๆ

Apple ประสบความสำเร็จในหลาย ๆ แอพ สกรีนช็อตตัวอย่าง:ข้อความลิงก์

ขอบคุณ! - ดอม


ลองดูหัวข้อนี้จาก Stack Overflow ก่อนหน้า (โดยทั่วไปแล้วสร้าง UILabels สองรายการและวางตำแหน่งให้สัมพันธ์กันอย่างถูกต้อง)
samkass

คำตอบ:


360

ปรับปรุง

ใน Swift เราไม่ต้องจัดการกับ iOS5 สิ่งเก่า ๆ นอกจากไวยากรณ์จะสั้นลงดังนั้นทุกอย่างกลายเป็นเรื่องง่าย:

สวิฟท์ 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
}

สวิฟท์ 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
}

การใช้งาน:

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

โบนัส: ความเป็นสากล

บางคนแสดงความคิดเห็นเกี่ยวกับความเป็นสากล โดยส่วนตัวฉันคิดว่ามันไม่ได้อยู่ในขอบเขตของคำถามนี้ แต่เพื่อจุดประสงค์ในการสอนนี่เป็นวิธีที่ฉันจะทำ

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

ผลลัพธ์ (สมมติว่าเป็นภาษาอังกฤษและภาษาญี่ปุ่น Localizable.strings มีอยู่)

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่


คำตอบก่อนหน้าสำหรับ iOS6 และใหม่กว่า (Objective-C ยังใช้งานได้):

ใน iOS6 UILabel, UIButton, UITextView, UITextFieldสนับสนุนการประกอบสตริงซึ่งหมายความว่าเราไม่จำเป็นต้องสร้างCATextLayerฐานะผู้รับของเราสำหรับสตริงมาประกอบ นอกจากนี้เพื่อสร้างสตริงที่เราไม่ต้องเล่นกับ CoreText อีกต่อไป :) เรามีคลาสใหม่ใน obj-c Foundation.framework เช่นNSParagraphStyleและค่าคงที่อื่น ๆ ที่จะทำให้ชีวิตของเราง่ายขึ้น เย้!

ดังนั้นถ้าเรามีสตริงนี้:

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

เราต้องการสร้างสตริงที่ประกอบขึ้นเท่านั้น:

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

มีโพสต์บล็อกเบื้องต้นที่ดีอยู่ที่นี่จาก guys ที่invasivecodeที่อธิบายด้วยตัวอย่างการใช้งานมากขึ้นNSAttributedStringมองหา"รู้เบื้องต้นเกี่ยวกับ NSAttributedString สำหรับ iOS 6"และ"สตริงประกอบสำหรับ iOS ที่ใช้ตัวสร้างอินเตอร์เฟส" :)

PS: รหัสข้างต้นมันควรจะทำงาน แต่มันก็รวบรวมสมอง ฉันหวังว่ามันจะเพียงพอ :)


คำตอบเก่าสำหรับ iOS5 และด้านล่าง

ใช้CATextLayerกับ NSAttributedString! เบาและเรียบง่ายกว่า 2 UILabels (iOS 3.2 ขึ้นไป)

ตัวอย่าง.

อย่าลืมเพิ่ม QuartzCore framework (จำเป็นสำหรับ CALayers) และ CoreText (จำเป็นสำหรับสตริงประกอบ)

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

ตัวอย่างด้านล่างจะเพิ่มเลเยอร์ย่อยไปยังแถบเครื่องมือของตัวควบคุมการนำทาง à la Mail.app ใน 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;
    }
}

ในตัวอย่างนี้ผมมีเพียงสองประเภทที่แตกต่างกันของตัวอักษร (ตัวหนาและปกติ) แต่คุณยังอาจมีขนาดแตกต่างกันตัวอักษรสีที่แตกต่างกันตัวเอียงขีดเส้นใต้ ฯลฯ ลองดูที่NSAttributedString / NSMutableAttributedStringและCoreText แอตทริบิวต์คีย์สตริง

หวังว่ามันจะช่วย


2
น่าเสียดายที่คำตอบนี้ (และคำตอบอื่น ๆ ) นั้นไม่ได้เป็นสากล การสนับสนุนแท็ก Html (<b>, <i>) เช่นเดียวกับบน Android คงจะยอดเยี่ยมมาก
Victor G

1
เนื่องจากนี่เป็นตัวอย่างที่ฉันไม่ต้องการจัดการกับสิ่งนั้น หากคุณต้องการการโลคัลไลซ์เซชันคุณสามารถรับคอมโพเนนต์วันที่จาก NSDate และค้นหาช่วงตัวหนา / ตัวหนาที่เหมาะสมโดยทางโปรแกรม (แทนการเข้ารหัสช่วงยากมีความคิดเห็นในรหัสด้านบนที่กล่าวถึงการเข้ารหัสฮาร์ดโค้ดไม่เหมาะ)
nacho4d

1
คุณควรพิจารณาใช้ตัวอักษร Objective-C ที่อ่านง่ายขึ้นในรหัสของคุณ ยกตัวอย่างเช่นจะกลายเป็น[NSDictionary dictionaryWithObjectsAndKeys: boldFont, NSFontAttributeName, foregroundColor, NSForegroundColorAttributeName, nil] @{ NSFontAttributeName: boldFont, NSForegroundColorAttributeName: foregroundColor }
PatrickNLT

@ nacho4d เยี่ยมมาก! แต่มีการพิมพ์ผิด: ไวยากรณ์ต้องใช้วงเล็บปีกกา ( {) ไม่ใช่วงเล็บเหลี่ยม ( [)
PatrickNLT

ฉันได้เพิ่มโค้ดบางส่วนที่แสดงให้เห็นถึงวิธีการที่เป็นมิตรกับสากล
nacho4d

85

ลองหมวดหมู่ใน UILabel:

นี่คือวิธีการใช้งาน:

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

และนี่คือหมวดหมู่

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

โปรดทราบว่านี่จะใช้งานได้ใน iOS 6 และใหม่กว่าเท่านั้น มันจะถูกละเว้นใน iOS 5 และรุ่นก่อนหน้า


2
หมวดหมู่ที่ดี แม้ว่ามันจะไม่ทำให้ตัวอักษรหนา เพื่อที่จะทำเช่นนั้นคุณควรทำเช่นนี้: @{NSFontAttributeName:[UIFont boldSystemFontOfSize:self.font.pointSize]}ฉัน upvoted
Lonkly

1
หากแบบอักษรของป้ายกำกับของคุณไม่ใช่แบบอักษรของระบบคุณจำเป็นต้องเปลี่ยน: [UIFont boldSystemFontOfSize:self.font.pointSize]TO[UIFont fontWithName:self.font.fontName size:self.font.pointSize]
le

48

นั่นเป็นเรื่องง่ายที่จะทำในInterface Builder :

1) ทำให้UILabel แสดงคุณสมบัติในตัวตรวจสอบคุณสมบัติ

ตัวอย่างตัวหนาขั้นตอนที่ 1

2) เลือกส่วนของวลีที่คุณต้องการทำให้เป็นตัวหนา

ตัวอย่างตัวหนาขั้นตอนที่ 2

3) เปลี่ยนแบบอักษร (หรือแบบอักษรตัวหนาของแบบอักษรเดียวกัน) ในตัวเลือกแบบอักษร

ตัวอย่างตัวหนาขั้นตอนที่ 3

นั่นคือทั้งหมด!


ดูเหมือนว่าคุณจะทำสิ่งนี้ได้เฉพาะสำหรับตัวหนา (และประเภทตัวอักษรอื่น ๆ ) ไม่ใช่เพื่อใช้คุณสมบัติอื่น ๆ เช่นขีดเส้นใต้? (แม้ว่าตัวเลือกฟอนต์มีสิ่งเหล่านั้นขีดเส้นใต้เป็นสีเทาสำหรับฉัน) คุณเห็นพฤติกรรมแบบเดียวกันหรือไม่
pj4533

2
ดูเหมือนว่าเป็นข้อความคงที่ดีอย่างไรก็ตามฉันไม่ทราบก่อนอ่านโพสต์นี้
preetam

ความกังวลของฉันเกี่ยวกับคุณสมบัติตัวสร้างส่วนต่อประสานใหม่นี้คือคุณถูกบังคับให้เลือกแบบอักษรที่กำหนดเองไม่ใช่แบบอักษรของระบบอีกต่อไปดังนั้นจะพลาดการใช้งานระบบทั้งหมดสำหรับผู้คนที่มองเห็น / การเข้าถึงได้บ้าง?
Litome

1
ฉันได้ทำบางส่วนของข้อความของฉันเป็นตัวหนาและมันแสดงให้เห็นว่ามันควรจะเป็นในการตรวจสอบคุณลักษณะ แต่ไม่ได้อยู่ในการจำลองหรือแม้กระทั่งในกระดานเรื่องราว
Besat

45

มีหมวดหมู่ตามหมวดหมู่ของ bbrame มันทำงานคล้ายกัน แต่ให้คุณทำตัวหนาUILabelหลาย ๆ ครั้งด้วยผลลัพธ์แบบสะสม

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

ด้วยการแก้ไขนี้คุณสามารถใช้งานได้หลายครั้งเช่น:

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

จะเป็นผลลัพธ์ด้วย: " อัปเดตแล้ว: 2012/10/14 21:59 PM "


มันจะเป็นตัวหนาในสตริงย่อยสุดท้ายเท่านั้นเช่น 21:59 PM เท่านั้น
Prajeet Shrestha

ฉันได้ทำการทดสอบเมื่อปีที่แล้วและดูเหมือนว่าจะทำงานในเวลานั้น จุดทั้งหมดของโพสต์ของฉันคือการเปลี่ยนหมวดหมู่ของ bbrame เพื่อจัดการตัวหนาหลายตัว ฉันไม่สามารถทำได้ในขณะนี้ แต่ในอีกสองสัปดาห์ฉันจะทดสอบโค้ดนี้อีกครั้งเพื่อให้แน่ใจว่ามันใช้งานได้
Crazy Yoghurt

ลองดูคำตอบของฉันด้านล่างนะ และโปรดแนะนำวิธีทำให้สามารถใช้ซ้ำได้
Prajeet Shrestha

27

มันใช้งานได้สำหรับฉัน:

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;

สำหรับเวอร์ชั่น Swift: ดูที่นี่


สวยงามและเรียบง่าย! ขอบคุณ!
โมนา

25

ฉันใช้คำตอบของ Crazy Yoghurt กับส่วนขยายที่รวดเร็ว

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

อาจจะไม่มีการแปลงที่ดีระหว่าง Range และ NSRange แต่ฉันไม่พบสิ่งที่ดีกว่า


1
ขอบคุณมาก ๆ! สิ่งที่ฉันต้องการ! ฉันเปลี่ยนบรรทัดที่สองboldSubstring(_:)เป็นvar range = text.string.range(of: substr, options: .caseInsensitive)สตริงที่มีตัวพิมพ์ใหญ่ต่างกัน
fl034

21

ตรวจสอบTTTAttributedLabel เป็นการแทนที่แบบแทนที่สำหรับ UILabel ที่ให้คุณมีแบบอักษรและสีแบบผสมในป้ายกำกับเดียวโดยตั้งค่า NSAttributedString เป็นข้อความสำหรับป้ายกำกับนั้น


5
ต้องเห็นด้วยกับการใช้การแทนที่ (มีไม่กี่รอบ) Apple ก็ยังทำงานของพวกเขาในสิ่งนี้ไม่เสร็จ นอกเหนือจากการฝึกหัดเชิงวิชาการฉันไม่คิดว่ามันคุ้มค่าที่จะพยายามทำความเข้าใจและใช้ระเบียบนี้ - มันอาจเป็นไปได้ที่จะจัดระเบียบอย่างเป็นทางการในรีลีสถัดไป (หรือมากกว่านั้น) :) github.com/AliSoftware/OHAttributedLabel
ดักจับ

@trapper - คุณบันทึกวันของฉันด้วยลิงก์นี้ ... +1000!
Duck

ฉันยังแนะนำ OHAttributedLabel เช่นกัน คุณสามารถใช้แท็ก HTML เช่น <b> และ <u> (และอื่น ๆ ) ได้ในสตริง
RyanG

12

ในกรณีนี้คุณสามารถลอง

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];

PS กำหนดค่าให้กับป้ายกำกับก่อน (เช่น displayLabel.text = @ "อัปเดต: 2013/12/23 21:59 PM";)
Mazen Kasser

8

เพื่อทำให้ข้อความเป็นตัวหนาและขีดเส้นใต้ใน UILabel เพียงเพิ่มบรรทัดต่อไปนี้ในรหัสของคุณ

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;

5

ใช้รหัสด้านล่าง ฉันหวังว่ามันจะช่วยคุณได้

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

4

สวิฟท์ 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)")

3

หวังว่าอันนี้จะตอบสนองความต้องการของคุณ ใส่สตริงเพื่อประมวลผลเป็นอินพุตและป้อนคำที่ควรเป็นตัวหนา / สีเป็นอินพุต

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
}

ขอบคุณ. Happy Coding


2

ไม่จำเป็นต้องใช้ NSRange ด้วยรหัสต่อไปนี้ฉันเพิ่งใช้งานในโครงการของฉัน (ใน 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.