为什么有些iOS字体系列不支持UIFontDescriptorTraitBold?

时间:2014-10-29 04:30:21

标签: ios uifont uifontdescriptor

我尝试用来获得粗体iOS UIFont给出字体系列名称的方法似乎只适用于某些字体。例如:

UIFont* font = [UIFont fontWithName:@"TimesNewRomanPS-BoldMT" size:12];
NSLog(@"A: Font name: %@", [font fontName]);

// desired method works for Helvetica Neue
UIFontDescriptor *desc = [[UIFontDescriptor alloc] init];
desc = [desc fontDescriptorWithFamily:@"Helvetica Neue"];
desc = [desc fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold];
font = [UIFont fontWithDescriptor:desc size:12];
NSLog(@"B: Font name: %@", [font fontName]);

// desired method fails for Times New Roman
desc = [[UIFontDescriptor alloc] init];
desc = [desc fontDescriptorWithFamily:@"Times New Roman"];
NSLog(@"desc: %@", desc);
desc = [desc fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold];
NSLog(@"desc bold: %@", desc);

打印(在iOS 8.1模拟器上):

A: Font name: TimesNewRomanPS-BoldMT
B: Font name: HelveticaNeue-Bold
desc: UICTFontDescriptor <0x7f9be0d05e80> = { NSFontFamilyAttribute = "Times New Roman"; }
desc bold: (null)

这是一个错误,还是不适用于每个字体系列(实际上都有一个粗体变体)?我真的不想被迫解析字体名称寻找&#34; Bold&#34;或者其他一些东西。

2 个答案:

答案 0 :(得分:4)

这是一个错误。 fontDescriptorWithSymbolicTraits:保证返回字体描述符;因此,返回nil是意外行为。

事实上,如果你用Swift重写同样的东西,它会导致崩溃,因为desc不是可选的:

var desc = UIFontDescriptor()
desc = desc.fontDescriptorWithFamily("Times New Roman")
desc = desc.fontDescriptorWithSymbolicTraits(.TraitBold)
println(desc); //crash

UIFontDescriptor是否会返回UIFont是一个单独的问题。你应该提交雷达。

答案 1 :(得分:1)

@ neural5torm为这个iOS8错误提供了一个很好的解决方法:

NSString *fontFamily = @"Arial";
BOOL isBold = YES;
BOOL isItalic = YES;
CGFloat fontSize = 20.0;
UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithFontAttributes:
    @{
        @"NSFontFamilyAttribute" : fontFamily,
        @"NSFontFaceAttribute" : (isBold && isItalic ? @"Bold Italic" : (isBold ? @"Bold" : (isItalic ? @"Italic" : @"Regular")))
    }];
UIFont *font = [UIFont fontWithDescriptor:fontDescriptor size:fontSize];

原帖: https://stackoverflow.com/a/26222986/3160700