2014-10-29 86 views
4

我试图用一个字体系列名称来获得大胆面对的iOS UIFont的方法似乎只适用于某些字体。例如:为什么一些iOS字体系列不支持UIFontDescriptorTraitBold?

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) 

这是一个错误,或者是它的设计不适用于所有的字体家族工作(实际上有一个大胆的变体)?我真的不希望被迫解析字体名称寻找“大胆”或这样的事情。

+0

我这个fontDescriptorWithSymbolicTraits的另一个受害者:错误。这是一个耻辱,因为它可以很好地处理iOS7上的任何字体。在此期间你找到了一个聪明的解决方法吗?我不想为“-Black | -Bold | -Italic | -Oblique”解析字体名称。 – Bluezen 2015-01-02 19:07:31

回答

4

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

事实上,如果你重写与斯威夫特同样的事情,它会导致崩溃,因为desc是不可选:

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

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

+0

谢谢!我为此提交了错误报告18812268。 – devx 2014-10-29 17:17:25

+0

@devx苹果有没有解决这个问题?我有同样的问题。 。 – Micrified 2015-12-29 21:13:10

+1

这已经改变了,可能在iOS 10 SDK/Swift 2.3/Xcode 8中。如果您查看'UIFontDescriptor'标头,您会发现:'public func fontDescriptorWithSymbolicTraits(symbolicTraits:UIFontDescriptorSymbolicTraits) - > UIFontDescriptor? //在给定符号特征的同一系列中返回一个新的字体描述符引用,或者如果系统中没有发现,则返回nil。因此,fontDescriptorWithSymbolicTraits不再保证返回字体描述符。 – 2016-09-27 07:29:29

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

相关问题