2014-10-29 78 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