如何检查UIFont是否是系统字体?

时间:2014-03-04 09:58:32

标签: ios iphone fonts uikit 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是系统。我几乎需要一个为变量返回BOOL YES的方法:system NOcustomFont4customFont5customFont6NO }。

由于 Helvetica Neue 是iOS7上的系统字体,因此在这些情况下是否应该返回YES或{{1}},这是一个争论的主题,但对于我的问题,无论哪种方式都没问题。

所以我的问题是:

如何验证UIFont实例是否是由任何一种系统字体方法创建的?

感谢您的帮助!

4 个答案:

答案 0 :(得分:6)

这是您想要的方法:

-(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

答案 1 :(得分:0)

只需检查fontName和/或familyName?

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

答案 2 :(得分: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;
    }
}

希望,这对你有帮助。

答案 3 :(得分: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);

唯一识别字体的另一个好方法是使用他们的postscript名称:

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