เป็นไปได้อย่างไรที่จะรวมทั้งตัวหนาและตัวหนาใน uiLabel
ฉันไม่ควรใช้ UIWebView .. ฉันอ่านแล้วอาจเป็นไปได้โดยใช้ NSAttributedString แต่ฉันไม่รู้ว่าจะใช้ยังไง ความคิดใด ๆ
Apple ประสบความสำเร็จในหลาย ๆ แอพ สกรีนช็อตตัวอย่าง:
ขอบคุณ! - ดอม
เป็นไปได้อย่างไรที่จะรวมทั้งตัวหนาและตัวหนาใน uiLabel
ฉันไม่ควรใช้ UIWebView .. ฉันอ่านแล้วอาจเป็นไปได้โดยใช้ NSAttributedString แต่ฉันไม่รู้ว่าจะใช้ยังไง ความคิดใด ๆ
Apple ประสบความสำเร็จในหลาย ๆ แอพ สกรีนช็อตตัวอย่าง:
ขอบคุณ! - ดอม
คำตอบ:
ใน 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 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: รหัสข้างต้นมันควรจะทำงาน แต่มันก็รวบรวมสมอง ฉันหวังว่ามันจะเพียงพอ :)
ใช้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 แอตทริบิวต์คีย์สตริง
หวังว่ามันจะช่วย
[NSDictionary dictionaryWithObjectsAndKeys: boldFont, NSFontAttributeName, foregroundColor, NSForegroundColorAttributeName, nil]
@{ NSFontAttributeName: boldFont, NSForegroundColorAttributeName: foregroundColor }
{
) ไม่ใช่วงเล็บเหลี่ยม ( [
)
ลองหมวดหมู่ใน 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 และรุ่นก่อนหน้า
@{NSFontAttributeName:[UIFont boldSystemFontOfSize:self.font.pointSize]}
ฉัน upvoted
[UIFont boldSystemFontOfSize:self.font.pointSize]
TO[UIFont fontWithName:self.font.fontName size:self.font.pointSize]
นั่นเป็นเรื่องง่ายที่จะทำในInterface Builder :
1) ทำให้UILabel แสดงคุณสมบัติในตัวตรวจสอบคุณสมบัติ
2) เลือกส่วนของวลีที่คุณต้องการทำให้เป็นตัวหนา
3) เปลี่ยนแบบอักษร (หรือแบบอักษรตัวหนาของแบบอักษรเดียวกัน) ในตัวเลือกแบบอักษร
นั่นคือทั้งหมด!
มีหมวดหมู่ตามหมวดหมู่ของ 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 "
มันใช้งานได้สำหรับฉัน:
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: ดูที่นี่
ฉันใช้คำตอบของ 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 แต่ฉันไม่พบสิ่งที่ดีกว่า
boldSubstring(_:)
เป็นvar range = text.string.range(of: substr, options: .caseInsensitive)
สตริงที่มีตัวพิมพ์ใหญ่ต่างกัน
ตรวจสอบTTTAttributedLabel เป็นการแทนที่แบบแทนที่สำหรับ UILabel ที่ให้คุณมีแบบอักษรและสีแบบผสมในป้ายกำกับเดียวโดยตั้งค่า NSAttributedString เป็นข้อความสำหรับป้ายกำกับนั้น
ในกรณีนี้คุณสามารถลอง
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];
เพื่อทำให้ข้อความเป็นตัวหนาและขีดเส้นใต้ใน 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;
ใช้รหัสด้านล่าง ฉันหวังว่ามันจะช่วยคุณได้
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:
// 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)")
หวังว่าอันนี้จะตอบสนองความต้องการของคุณ ใส่สตริงเพื่อประมวลผลเป็นอินพุตและป้อนคำที่ควรเป็นตัวหนา / สีเป็นอินพุต
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
ไม่จำเป็นต้องใช้ 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
หากคุณต้องการทำให้การใช้สตริงที่ทำง่ายขึ้นลองใช้ Attributed String Creator ซึ่งจะสร้างรหัสให้คุณ https://itunes.apple.com/us/app/attributed-string-creator/id730928349