UILabel外观字体和属性字符串字体

时间:2014-07-30 04:09:30

标签: ios objective-c uilabel nsattributedstring uiappearance

在我的应用中,我有一个全局自定义字体应用于所有标签,如:

UIFont *font = [UIFont fontWithName:kMyFontName size:15.0]; 
[[UILabel appearance] setFont:font];

这很好用。但是,在某些情况下,我希望能够为UILabel字符串的特定区域指定不同的字体。

所以我有这样的事情:

NSString *string = @"Foo Bar Baz";
UIFont *boldFont = [UIFont fontWithName:kMyBoldFontName size:15.0]; 
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:string];
[attrString setAttributes:@{ NSFontAttributeName: boldFont } range:NSMakeRange(0, 3)];
self.myLabel.attributedText = attrString;

然而,这似乎并不奏效。我期待" Foo"是粗体,但整个字符串只有默认字体。它好像根本没有应用粗体字体,并且被UILabel外观代理上的字体集覆盖。

当我删除UILabel外观线时,它工作正常(我可以看到粗体字符串的一部分)。基本上我想将自定义字体应用于标签,但是应用于字符串的不同区域的单独字体。通常这适用于属性字符串,但由于某种原因设置UILabel外观字体会禁用此功能(或者看起来似乎如此)。

  • 预期结果:" Foo Bar Baz"
  • 实际结果:" Foo Bar Baz"

如果我删除[[UILabel appearance] setFont:]行,那么它可以正常工作:

  • " Foo Bar Baz"

(但是字符串的其余部分没有设置自定义字体。)

所以我的问题是:有没有办法指定一个字体用作默认的应用程序范围,但仍然可以使用属性字符串部分覆盖它?

如果有人能向我解释为什么这不起作用我会很感激。

3 个答案:

答案 0 :(得分:13)

在设置属性字符串之前将font和textColor设置为nil。

答案 1 :(得分:10)

您无法混合和匹配属性文本和纯文本;这就是为什么删除setFont方法的原因 - 因为当你使用它时,它会假定一个明文UILabel。

NSString *string = @"Foo Bar Baz";
UIFont *boldFont = [UIFont fontWithName:kMyBoldFontName size:15.0]; 
// Define your regular font
UIFont *regularFont = [UIFont fontWithName:kMyFontName size:15.0];
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:string];
// And before you set the bold range, set your attributed string (the whole range!) to the new attributed font name
[attrString setAttributes:@{ NSFontAttributeName: regularFont } range:NSMakeRange(0, string.length - 1)];
[attrString setAttributes:@{ NSFontAttributeName: boldFont } range:NSMakeRange(0, 3)];
self.myLabel.attributedText = attrString;

答案 2 :(得分:2)

有两个重要部分:

  1. UIAppearance适用于将UI元素添加到窗口
  2. 的时刻
  3. labelInstance.font = ...重置当前设置的属性字符串
  4. 的所有字体属性

    因此,如果您要保留UIAppearance自定义,则必须在将标签添加到窗口后设置自定义属性字符串。

    有关UIAppearance如何运作的参考文章:Peter Steinberger's cool article