NSString 的粗体部分有什么方法吗?

有没有办法只加粗字符串的一部分? 例如:

大概距离: 120米

谢谢!

85629 次浏览

NSString只是一个数据容器,它不包含任何关于表示问题的细节。

听起来您可能想要做的是用于显示字符串的 UILabel的粗体部分。我觉得你做不到。但是你总是可以把 UI 分成三个标签,一个是“近似距离:”,一个是“ 120米”,一个是“离开”。把它们放在一条直线上,你就会得到想要的效果。

另一种选择可能是使用 UIWebView和一点点标记来显示包含嵌入式格式信息的字符串,如下所述:

Http://iphoneincubator.com/blog/windows-views/display-rich-text-using-a-uiwebview

可以所做的就是使用 NSAttributedString

NSString *boldFontName = [[UIFont boldSystemFontOfSize:12] fontName];
NSString *yourString = ...;
NSRange boldedRange = NSMakeRange(22, 4);


NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:yourString];


[attrString beginEditing];
[attrString addAttribute:kCTFontAttributeName
value:boldFontName
range:boldedRange];


[attrString endEditing];
//draw attrString here...

看一下用核心文本绘制 NSAttributedString对象的 这本方便的花花公子指南

正如 Jacob 提到的,您可能希望使用 NSAttributedStringNSMutableAttributedString。下面是一个示例,说明您可以如何做到这一点。

NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"Approximate Distance: 120m away"];
NSRange selectedRange = NSMakeRange(22, 4); // 4 characters, starting at index 22


[string beginEditing];


[string addAttribute:NSFontAttributeName
value:[NSFont fontWithName:@"Helvetica-Bold" size:12.0]
range:selectedRange];


[string endEditing];

如果你不想麻烦字体(因为不是每种字体都包含“粗体”) ,这里有另一种方法可以做到这一点。请注意,这目前只能在 OS X 上使用。.:

NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:"Approximate Distance: 120m away"];
[attrString beginEditing];
[attrString applyFontTraits:NSBoldFontMask
range:NSMakeRange(22, 4)];
[attrString endEditing];

在 Xamarin ios 中,你可以这样加粗 NSString 的一部分:

public static NSMutableAttributedString BoldRangeOfString (string str, float fontSize, int startRange, int lengthRange)
{
var firstAttributes = new UIStringAttributes {
Font = UIFont.BoldSystemFontOfSize(fontSize)
};


NSMutableAttributedString boldString = new NSMutableAttributedString (str);
boldString.SetAttributes (firstAttributes.Dictionary, new NSRange (startRange, lengthRange));
return boldString;
}

并调用这个方法:

myLabel = new UILabel ();
...
myLabel.AttributedText = BoldRangeOfString("my text", fontSize, startRange, lengthRange);

当我使用这个属性创建 UILabel 时,上面的代码让我崩溃了。

我用了这个代码,它工作了:

NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:string];
NSRange boldedRange = NSMakeRange(0, 1);
UIFont *fontText = [UIFont systemFontOfSize:12]; //[UIFont fontWithName:@"Lato-Bold" size:12];
NSDictionary *dictBoldText = [NSDictionary dictionaryWithObjectsAndKeys:fontText, NSFontAttributeName, nil];
[attrString setAttributes:dictBoldText range:boldedRange];

我把“ Jacob Relkin”和“ Andrew Marin”加在一起回答,否则,我得到的就是崩溃。 iOS9的答案如下:

UIFont *boldFont = [UIFont boldSystemFontOfSize:12];
NSString *yourString = @"Approximate Distance: 120m away";
NSRange boldedRange = NSMakeRange(22, 4);


NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:yourString];


[attrString beginEditing];
[attrString addAttribute:NSFontAttributeName
value:boldFont
range:boldedRange];


[attrString endEditing];

我看了一下官方文档: 12

斯威夫特

还包括获取要动态加粗的字符串的范围

let nameString = "Magoo"
let string = "Hello my name is \(nameString)"


let attributes = [NSFontAttributeName:UIFont.systemFontOfSize(14.0),NSForegroundColorAttributeName: UIColor.black]
let boldAttribute = [NSFontAttributeName:UIFont.boldSystemFontOfSize(14.0)]


let attributedString = NSMutableAttributedString(string: string, attributes: attributes)


let nsString = NSString(string: string)
let range = nsString.rangeOfString(nameString)


if range.length > 0 { attributedString.setAttributes(boldAttribute, range: range) }


someLabel.attributedText = attributedString

要在不对字体进行硬编码的情况下加粗字符串,可以使用 StrokeWidth 属性带负值:

let s = NSMutableAttributedString(string: "Approximate Distance: 120m away")
s.addAttribute(NSStrokeWidthAttributeName, value: NSNumber(value: -3.0), range: NSRange(22..<26))

如果你不想硬编码的字体或/和大小尝试这个代码粗体全字符串:

NSMutableAttributedString *myString = [[NSMutableAttributedString alloc] initWithString:mainString];
[myString beginEditing];
[myString addAttribute:NSStrokeWidthAttributeName
value:[[NSNumber alloc] initWithInt: -3.f]
range:NSMakeRange(0, [mainString length])];
[myString endEditing];

使用 Swift5 + 更快捷的方式

let labelNotes = UILabel()  //or UITextView(), etc...
let attributedNotes = NSMutableAttributedString(string: "Bold: some stuff not bold")
attributedNotes.addAttribute(NSAttributedString.Key.font, value: UIFont.boldSystemFont(ofSize: 14), range: NSRange(location: 0, length: 5))
labelNotes.attributedText = attributedNotes