2014-03-27 22 views
1

我試圖在iOS應用程序中指定每個標籤的字體系列,以便稍後更改它們。我不想通過Interface Builder並重置每個屏幕上的每個字體。根據this post,我創建了一種方法,可以查找視圖中的所有字體並相應地設置它們。檢測iOS中的燈光字體

在我的情況下,根據字體是粗體,斜體還是淺色(例如骨感),我需要使用幾種不同的字體系列。這些都位於單獨的文件中,如「OpenSans-Semibold.ttf」,「OpenSans-Italic.ttf」和「OpenSans-Light.ttf」。

理想情況下,我希望能夠在Interface Builder中將字體設置爲粗體,斜體或淺色,然後使用相應的.ttf文件使代碼覆蓋字體系列。根據this post,我可以很容易地檢測到字體是否已設置爲粗體或斜體,但是發現它是否輕便似乎不起作用。

對於淺色字體,「特徵」的值爲0x0 - 因此沒有設置標誌。是否有另一種檢測光字體的方法?

代碼如下所示:

- (void) setFontFamily:(UIView*)view 
{ 
    if([view isKindOfClass:[UILabel class]]) 
    { 
     UILabel* label = (UILabel*)view; 

     UIFontDescriptorSymbolicTraits traits = label.font.fontDescriptor.symbolicTraits; 
     BOOL bold = traits & UIFontDescriptorTraitBold; 
     BOOL italic = traits & UIFontDescriptorTraitItalic; 

     if(bold) 
      [label setFont:[UIFont fontWithName:@"OpenSans-Semibold"size:label.font.pointSize]]; 
     else if(italic) 
      [label setFont:[UIFont fontWithName:@"OpenSans-Italic"size:label.font.pointSize]]; 
     else if(light) 
      [label setFont:[UIFont fontWithName:@"OpenSans-Light"size:label.font.pointSize]]; 
     else 
      [label setFont:[UIFont fontWithName:@"OpenSans"size:label.font.pointSize]]; 
    } 

    for(UIView* subView in view.subviews) 
     [self setFontFamily:subView]; 
} 
+2

您是否有可能誤解「光」?斜體和粗體是_symbolic_特徵。 「光」是一個_weight_特徵。您的代碼中沒有任何內容與體重有關。 – matt

+2

哦,對不起,還有一件事:在iOS 7上,你知道UIFontDescriptor嗎?您可能會發現使用起來更愉快。 – matt

+0

我很可能誤解了光的技術定義。儘管不是大膽的重量特質?光在相反的方向上本質上是一回事。無論如何,我沒有看到與字體重量有關的任何API(例如沒有CTFontWeightTraits)。有這樣的事嗎? – d512

回答

1

你確定基於其特性的字體整個方法是有問題:

else if(italic) 
    [label setFont: 
     [UIFont fontWithName:@"OpenSans-Italic"size:label.font.pointSize]]; 

您是硬編碼基於性狀的字體名稱。相反,請根據名稱和特徵向運行時詢問字體。在這個非常簡單的例子,我找出安裝的字體,如果有的話,是吉爾三世斜體變種:

UIFont* f = [UIFont fontWithName:@"GillSans" size:15]; 
CTFontRef font2 = 
    CTFontCreateCopyWithSymbolicTraits (
     (__bridge CTFontRef)f, 0, nil, 
     kCTFontItalicTrait, kCTFontItalicTrait); 
UIFont* f2 = CFBridgingRelease(font2); 

請注意,此碼是有效的iOS中7只,其中CTFontRef和UIFont是免費電話相互橋接。從理論上講,應該可以通過UIFontDescriptor做到這一點,而不需要C函數,但是最後一次看起來很麻煩並且不適用於所有字體(例如Gill Sans!)。

這就是你應該做的事情:確定你的起始字體的符號和重量特徵,然後詢問運行時的最接近你的要求的字體。