iOS – Как определить, является ли шрифт полужирным / черным / тяжелым …?

Я хочу определить стиль ( жирный , тяжелый , черный ) шрифта. Но я могу просто определить, выделен ли шрифт.

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

В UIFontDescriptorSymbolicTraits нет черной или тяжелой черты.

Способ проверить имя шрифта, содержит ли он «черную» или «тяжелую» строку, но это кажется ненадежным.

Существует UIFontWeightTrait , но это просто для UIFont systemFontOfSize: weight:

И я хочу создать свой собственный шрифт со стилем, если есть такой стиль.

Чтобы проверить, является ли он тяжелым или черным :

 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 

И как создать шрифт с использованием, например, тяжелый:

 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") } } 

Быстрая версия для определения стиля шрифта Heavy / Black

 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) 

Это дает вам выделение жирным шрифтом или нет:

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

Вот несколько экспериментов: это дает правильный ответ, даже если выделен полужирный шрифт, или если вы настроили символьные символы шрифта вручную:

введите описание изображения здесь