iOS - 如何检测字体是否为粗体/黑色/重体...?

3

我希望能够检测字体的风格(加粗加重黑体),但我只能检测到字体是否加粗。

BOOL isBold = (font.fontDescriptor.symbolicTraits & UIFontDescriptorTraitBold)!=0;

UIFontDescriptorSymbolicTraits 中没有黑体或加粗的特征。

一种方法是检查字体名称是否包含字符串“black”或“heavy”,但这似乎不可靠。

UIFontWeightTrait,但它仅适用于 UIFont systemFontOfSize:weight:

如果有这些样式可用,我想创建自定义字体并添加一个样式。


顺便说一句,如果你想检查加粗/斜体,我已经回答了。 - Shabir jan
谢谢,我已经知道如何检测粗体/斜体样式,就像我在问题中提到的那样。 - tomfriwel
你需要重度/黑色使用的Swift版本吗? - Shabir jan
我知道如何在Swift中实现这一点,但对于其他人,您可以编写一个Swift版本。 - tomfriwel
好的,我会这样做。 - Shabir jan
检查我的 Swift 答案。 - Shabir jan
3个回答

3

要检查它是“重”还是“黑”:

NSString *fontUsage = font.fontDescriptor.fontAttributes[@"NSCTFontUIUsageAttribute"];
if ([fontUsage isEqualToString:@"CTFontHeavyUsage"]) {
    NSLog(@"It's Heavy");
}
else if ([fontUsage isEqualToString:@"CTFontBlackUsage"]) {
    NSLog(@"It's Black");
}

其他用法选项列表非常简单,只需按格式“CTFont......Usage”使用,我测试过的列表包括:
//CTFontUltraLightUsage,CTFontThinUsage,CTFontLightUsage,CTFontMediumUsage,CTFontDemiUsage

如何创建一个带有使用说明的字体,例如 heavy:

UIFontDescriptor *fontDescriptor = [[UIFontDescriptor alloc] initWithFontAttributes:@{@"NSCTFontUIUsageAttribute":@"CTFontHeavyUsage"}];
UIFont *font = [UIFont fontWithDescriptor:fontDescriptor size:17];

检查Swift3版本:

if let fontUsage = font.fontDescriptor.fontAttributes["NSCTFontUIUsageAttribute"] as? String {
    if fontUsage == "CTFontHeavyUsage" {
        print("It's Heavy")
    }
    else if fontUsage == "CTFontBlackUsage" {
        print("It's Black")
    }
}

我只想要这个,是否有像“CTFontBlackUsage”这样的字符串列表?我还想检测其他风格。 - tomfriwel
如何创建具有黑色或其他样式的自定义字体? - tomfriwel
谢谢,我忘了有 initWithFontAttributes - tomfriwel

1

检测字体 Heavy/Black 样式的 Swift 版本

let fontUsage = font.fontDescriptor.fontAttributes["NSCTFontUIUsageAttribute"] as! String
if fontUsage == "CTFontHeavyUsage"{
    print("It is heavy")
}
else if fontUsage == "CTFontBlackUsage"{
    print("it's black")
}

并创建带有属性的字体:

let fontDescriptor = UIFontDescriptor(fontAttributes: ["NSCTFontUIUsageAttribute" : "CTFontHeavyUsage"])
let font = UIFont(descriptor: fontDescriptor, size: 17)

0

这将告诉你一个字体是否为粗体:

var isBold = label.font.fontDescriptor.symbolicTraits.contains(.traitBold)

这里有一些实验:即使设置了粗体字体或手动将字体的符号特征设置为粗体,也可以给出正确的答案:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接