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

Ios 如何检查UIFont是否为系统字体?,ios,iphone,fonts,uikit,uifont,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-Ligh

我有以下创建多个字体的代码

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
:systemFont1、systemFont2、systemFont3和
NO
用于
customFont4
customFont5
customFont6

由于在iOS7上,Helvetica Neue是系统字体,这是一个争论的主题,在这些情况下,它是否应该返回
NO
YES
,但对于我的问题,这两种方式都可以

所以我的问题是:

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


谢谢你的帮助

只需检查fontName和/或familyName

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

以下是您想要的方法:

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

我已经创建了方法,并在ios6iOS7中进行了测试。它工作得很好。我得到了你们期望的结果

以下是代码:

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

希望对您有所帮助。

字体不仅仅由名称和大小组成。这是更彻底的检查。警告:仅适用于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]];

这只告诉我名字。这在iOS 6和iOS 7上是不同的。我猜我可以硬编码这些,但我想避免这种情况。由于每次都要创建字体的新实例,这种方法的性能如何?好问题。如果不希望每次都创建实例,可以在.h文件中声明实例,并在viewDidLoad函数中声明。然后您可以使用上述函数中的实例。对于粗体和斜体选项?考虑到它只比较了它应该工作的姓氏……是的,因为它检查了它的家族,所以对于
systemFont
boldSystemFont
italicSystemFont
上述方法将返回YES。应该在哪个类上实现它?我在UIFont上将其作为一个类别实现。@Legoless那么它需要一个参数是非常混乱的。还有,
是什么?是:否
胡说八道?首先,此方法在IOS 6及更早版本中崩溃。其次@Legoless想找出systemFont和customFont之间的区别。但是当您使用
fontDescriptor
时,对于
[UIFont systemFontOfSize:12.0]
[UIFont systemFontOfSize:13.0]
来说,它将返回false,这在这里是不需要的。@Legoless只想知道使用的字体是否为systemFont。