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

Posted

技术标签:

【中文标题】UILabel 外观字体和属性字符串字体【英文标题】:UILabel appearance font and attributed string font 【发布时间】:2014-09-21 14:40:26 【问题描述】:

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

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巴兹”

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

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

另外,如果有人可以向我解释为什么这不起作用,我将不胜感激。

【问题讨论】:

定义“不起作用”。实际发生了什么? @rmaddy 很抱歉,我已经用更多细节更新了我的问题。如果还不清楚,请告诉我。 只是作为一个测试,尝试做:self.myLabel.font = nil;. @rmaddy 有趣的建议,但这似乎不起作用。 你检查自定义字体是否支持粗体,因为某些字体不支持粗体? 【参考方案1】:

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

【讨论】:

这对我有用,谢谢。【参考方案2】:

您不能混合和匹配属性文本和纯文本;这就是删除 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;

【讨论】:

在没有[UILabel appearance] 字体规范的情况下也可以工作(就像你说的那样)。我想以某种方式保持全局外观,这可能吗?否则我必须手动设置应用程序中每个标签的字体(包括按钮和标签栏项目中的隐式标签)。 你不能不幸地使用属性标签,但为了保持简单和一致,最简单的做法是继承 UILabel 并在 init 上定义默认值;之后,您可以像在那里一样设置更改。 到字符串末尾的范围应该是 (string.length - 1),因为范围从 0 开始。【参考方案3】:

有两个重要的部分:

    UIAppearance 适用于向窗口添加 UI 元素时 labelInstance.font = ... 重置当前设置的属性字符串的所有字体属性

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

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

【讨论】:

以上是关于UILabel 外观字体和属性字符串字体的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中更改 UILabel 文本某些部分的字体属性? [复制]

故事板中的 UILabel 子类外观

富文本设置文字颜色和字体

IText7如何解码字段的默认外观int字体对象及其属性

具有不同字体大小和颜色的UILabel文本[重复]

UIlabel的字体自适应属性