2014-03-04 12 views
2

我有下面的代碼來創建多個字體。如何檢查UIFont是否爲系統字體?

UIFont* systemFont1 = [UIFont systemFontOfSize:12.0]; 
UIFont* systemFont2 = [UIFont boldSystemFontOfSize:12.0]; 
UIFont* systemFont3 = [UIFont italicSystemFontOfSize:12.0]; 

UIFont* customFont1 = [UIFont fontWithName:@"HelveticaNeue-Light" size:12.0]; 
UIFont* customFont2 = [UIFont fontWithName:@"HelveticaNeue-Regular" size:12.0]; 
UIFont* customFont3 = [UIFont fontWithName:@"HelveticaNeue-Thin" size:12.0]; 

UIFont* customFont4 = [UIFont fontWithName:@"MyriadPro" size:12.0]; 
UIFont* customFont5 = [UIFont fontWithName:@"MyriadPro-Italic" size:12.0]; 
UIFont* customFont6 = [UIFont fontWithName:@"MyriadPro-Condensed" size:12.0]; 

我想知道哪些UIFont的是制度。我實際上需要一種方法,它將爲變量返回一個BOOLYES:systemFont1,systemFont2,systemFont3和NOcustomFont4,customFont5,。

由於Helvetica Neue字體是iOS7系統字體,這是主題辯論,是否應該在這些情況下返回NOYES,但我的問題,這將是罰款無論哪種方式。

所以我的問題是:

如何驗證是否UIFont實例是通過任意的系統字體方法產生的?

謝謝你的幫助!

回答

5

這裏是你希望你的方法:

-(BOOL)isSystemFont:(UIFont *)font 
{ 
    return ([[font familyName] isEqualToString:[[UIFont systemFontOfSize:12.0f] familyName]])?YES:NO; 
} 

或在Swift3擴展

extension UIFont { 
    func isSystemFont() -> Bool { 
     return self.familyName == UIFont.systemFont(ofSize: 12.0).familyName 
    } 
} 

以上方法將返回,因爲你需要

if([self isSystemFont:systemFont1]) NSLog(@"SystemFont"); 
else NSLog(@"Custom Font"); 
if([self isSystemFont:customFont1]) NSLog(@"SystemFont"); 
else NSLog(@"Custom Font"); 

輸出是

2014-03-04 15:48:18.791 TestProject[4031:70b] SystemFont 
2014-03-04 15:48:18.791 TestProject[4031:70b] Custom Font 
+0

你是否檢查過這是否也適用於iOS 6? – Legoless

+0

是的。它在iOS 6中工作正常.. –

+0

哦,我看到你編輯了答案。 – Legoless

0

只需檢查fontName和/或familyName?

NSLog(@"Fontname: %@", systemFont1.fontName); 
NSLog(@"Familyname: %@", systemFont1.familyName); 
+0

這隻會告訴我的字體名稱。這在iOS 6和iOS 7上是不同的。我猜我可以硬編碼這些,但我想避免這種情況。 – Legoless

0

我已經建立的方法和在兩個iOS 6中iOS7測試。它工作正常。我得到的結果是你所期望的。

這裏是代碼:

- (BOOL)isSystemFont:(UIFont*)pFont { 
    NSLog(@"pFont-%@",pFont.familyName); 

    // Object created for comparing system font with custom font 
    UIFont *font = [UIFont systemFontOfSize:10]; 
    NSLog(@"Font-%@",font.familyName); 

    if ([pFont.familyName isEqualToString:font.familyName]) { 
     return YES; 
    } else { 
     return NO; 
    } 
} 

希望,這將可能對您有所幫助。

+0

由於您每次都創建一個字體的新實例,因此此方法的性能如何? – Legoless

+0

好問題。如果您不想每次都創建實例,則可以在.h文件中聲明實例並在viewDidLoad函數中聲明。然後你可以在上面的函數中使用該實例。 – Gaurav

0

字體由多於名稱和大小組成。這是一個更徹底的檢查。警告:僅在iOS 7

BOOL FontIsEqualToFont(UIFont *font1, UIFont *font2) 
{ 
    return [[[font1 fontDescriptor] fontAttributes] isEqual:[[font2 fontDescriptor] fontAttributes]]; 
} 

// use as follows: 
BOOL isSystemFont = FontIsEqualToFont(systemFont1, customFont1); 

工作的另一個好方法唯一標識的字體是用自己的名字後記:

BOOL fontsAreEqual = [[[font1 fontDescriptor] postScriptName] isEqualToString:[[font2 fontDescriptor] postScriptName]]; 
+0

首先,這個方法在iOS 6及更早版本中崩潰。其次@Legoless想要找出systemFont和customFont之間的區別。但是,當你使用'fontDescriptor'來處理'[UIFont systemFontOfSize:12.0]'和'[UIFont systemFontOfSize:13.0]'時,它將返回false,這在這裏不需要。 –

+0

@Legoless只是想知道使用的字體是不是systemFont。 –

相關問題