有什么办法可以加粗NSString的一部分吗?


77

有什么办法可以只对字符串的一部分加粗吗?例如:

大约距离:120米

谢谢!


3
这取决于您要显示的内容,因为字符串只是一系列字符,并且不包含格式信息。
BoltClock

Answers:


103

可以做的是使用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用Core Text绘制对象。


2
谁能告诉我“ kCTFontAttributeName”的定义是什么?
索韩

1
哎呀。只是想知道这是在CoreText框架的CTFont.h中定义的常数。
索安(Sohan)

8
它说:使用未定义的标识符“ kCTFontAttributeName”,您的意思是“ NSFontAttributeName”吗?怎么了 我可以改用NSFontAttributeName吗?
测试人员

1
@tester您要针对哪个版本的iOS?我觉得NSFontAttributeName只能在OS X
雅各布Relkin

11
这在iOS7上不起作用(使用exc_bad_access崩溃)。原因是您必须在发送消息时发送字体而不是字体名称。@Chris Frederick在下面正确地做到了。
菲利普·萨布林

61

正如Jacob所提到的,您可能想要使用anNSAttributedString或an NSMutableAttributedString。以下是如何执行此操作的一个示例。

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

1
当我尝试这个时,我就Use of Undeclared identifier 'NSFont'value:线了。我该如何解决?
ZuluDeltaNiner 2014年

这是一个很好的例子。在第一行的方法@之后,示例字符串附近缺少initWithString:。:)
克利夫顿·拉布鲁姆

12
@ZuluDeltaNiner如果您使用的是iOS,请替换NSFontUIFont
Clifton

我前一阵子想通了。我想我忘了删除我的评论。
ZuluDeltaNiner 2014年

2
救了我!这个问题的答案需要编辑,我在此&^%#上花了两个小时
Michal Shatz 2014年

12

如果您不想打扰字体(因为并非每个字体的变体都包含“粗体”),这是另一种方法。请注意,这仅在OS X上可用...:

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

NSBoldFontMask是否为iOS声明?有替代品吗?
coolcool1994 2015-3-3

@ coolcool1994-对不起,不是我所知道的。我将编辑我的答案以阐明这是OS X的唯一把戏……
yura 2015年

beginEditing和endEditing是“被子类覆盖,以缓冲或优化对接收者的字符或属性的一系列更改”,此处不需要。否则,这正是我所需要的。
green_knight

6

当我使用此attributedString创建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];

5

迅速

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

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

4

要对字符串加粗而不对其字体进行硬编码,可以将StrokeWidth属性使用负值:

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

3

AnNSString只是一个数据容器。它不包含有关演示文稿问题的任何详细信息。

听起来您可能想要做的是UILabel用于显示字符串的粗体部分。我认为您无法做到。但是您始终可以将UI分为三个标签,一个用于“近似距离:”,一个用于“ 120 m ”,一个用于“离开”。将它们彼此排成一行,您将获得理想的效果。

另一个选择可能是使用一UIWebView点点标记来显示带有嵌入式格式信息的字符串,如此处所述:

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


2

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

6
问题不是关于Xamarin。
Zia

4
Xamarin与相同的对象NSString一起使用,问题未指定答案应使用哪种语言。我来这里是为了寻找Xamarin这样做的语法。有效答案。

2

我加上@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


1

使用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

0

如果您不想对字体或/和大小进行硬编码,请尝试以下代码以粗体显示完整的字符串:

NSMutableAttributedString *myString = [[NSMutableAttributedString alloc] initWithString:mainString];
[myString beginEditing];
[myString addAttribute:NSStrokeWidthAttributeName
                         value:[[NSNumber alloc] initWithInt: -3.f]
                         range:NSMakeRange(0, [mainString length])];
[myString endEditing];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.