2013-04-15 33 views
25

如果我有一個UIFont對象,是否可以將它轉換爲粗體?我不知道字體名稱,我只有一個UIFont對象。我想要的是一個功能,如如何從常規UIFont創建粗體UIFont?

UIFont *boldFontFromFont(UIFont *input) 
{ 
    return [input derivedFontWithFontWeight:UIFontWeightBold]; 
} 

如何更改代碼以使其可以工作。提前(上面的代碼不工作,我只是做它來說明這一點。)

感謝。

回答

11

要獲得粗體字體,您需要傳遞字體系列的特定字體名稱。您可以從給定的字體中獲取字體系列名稱,然後列出該系列中的所有字體。一般來說,粗體字的名稱中將包含「粗體」,但格式不嚴格,例如可能會有變體,如「Helvetica-BoldOblique」。你可以從這個代碼開始:

- (UIFont *)boldFontFromFont:(UIFont *)font 
{ 
    NSString *familyName = [font familyName]; 
    NSArray *fontNames = [UIFont fontNamesForFamilyName:familyName]; 
    for (NSString *fontName in fontNames) 
    { 
     if ([fontName rangeOfString:@"bold" options:NSCaseInsensitiveSearch].location != NSNotFound) 
     { 
      UIFont *boldFont = [UIFont fontWithName:fontName size:font.pointSize]; 
      return boldFont; 
     } 
    } 
    return nil; 
} 
+0

嗯,有一個問題:對於systemFont,你有familyName ==「.Helvetica NeueUI」和fontNames數組是空數組: -/ – Michael

+1

@Michael我試過了'UIFont * boldFont = [self boldFontFromFont :[UIFont systemFontOfSize:12.0]];'。 NSLog的輸出是:' font-family:「Helvetica-BoldOblique」; font-weight:bold; font-style:italic; font-size:12px' – filwag

+0

好的,你用過ios6嗎?因爲我使用ios 5.也許字體系統在ios6中改變了? – Michael

2

您可以使用

[UIFont boldSystemFontOfSize:12]. 

如果您正在使用自定義字體,你必須使用的名稱直接

[UIFont fontWithName:@"Helvetica-Bold" size:17.0]. 

你可以看一下有可能的字體名稱

[UIFont fontNamesForFamilyName:@"American Typewriter"]. 

在這篇文章中:https://stackoverflow.com/a/15388946/436818本M有一個想法如何動態地獲得粗體版本。但是擴展該方法以確保獲得大膽版本(如果存在),因爲還有其他大膽版本,如CondensedBold。

77

的iOS 7引入了一個新UIFontDescriptor類,這使得它容易得多:

UIFont *font = [UIFont fontWithName:@"Helvetica Neue" size:12]; 
NSLog(@"plain font: %@", font.fontName); // 「HelveticaNeue」 

UIFont *boldFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold] size:font.pointSize]; 
NSLog(@"bold version: %@", boldFont.fontName); // 「HelveticaNeue-Bold」 

UIFont *italicFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic] size:font.pointSize]; 
NSLog(@"italic version: %@", italicFont.fontName); // 「HelveticaNeue-Italic」 

UIFont *boldItalicFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold | UIFontDescriptorTraitItalic] size:font.pointSize]; 
NSLog(@"bold & italic version: %@", boldItalicFont.fontName); // 「HelveticaNeue-BoldItalic」 

誰的人來到這裏尋找可可(OS/X)等同,UIFontDescriptor來自NSFontDescriptor,可用自10.3 。

+0

.......不錯:) – Michael

+0

不適用於ArialMT – ChikabuZ

5

試圖使用的字體或家人的名字不再正常工作,因爲iOS的7,由於系統字體的神祕字體系列名稱派生黑體/斜體。下面是使用UIFontDescriptor類派生粗體/斜體字體的簡單擴展。

+(UIFont *) font:(UIFont *)font bold:(BOOL)bold italic:(BOOL)italic 
{ 
    NSUInteger traits = 0; 
    if (bold) 
    { 
     traits |= UIFontDescriptorTraitBold; 
    } 
    if (italic) 
    { 
     traits |= UIFontDescriptorTraitItalic; 
    } 
    return [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:traits] size:font.pointSize]; 
} 
14

如果你正在尋找迅速執行

let normalFont = UIFont(name: "FONT_NAME", size: CGFloat(20))! 
let boldFont = UIFont(descriptor: normalFont.fontDescriptor.withSymbolicTraits(.traitBold)!, size: normalFont.pointSize) 

希望這有助於!乾杯!