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

4
我有以下代码,可以创建多个字体。
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属于系统字体。我需要一个能够返回变量:systemFont1、systemFont2、systemFont3的BOOL YES,并返回NOcustomFont4customFont5customFont6的方法。
由于Helvetica Neue是iOS7上的系统字体,因此这是一个争议话题,无论以何种方式返回,在我的问题中都可以。
所以我的问题是:
如何验证UIFont实例是否是通过系统字体方法之一创建的?
谢谢您的帮助!
4个回答

9

以下是您所需要的方法:

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

是的,因为它检查了它们的家族,所以对于 systemFontboldSystemFontitalicSystemFont 方法将返回 YES。 - Tapas Pal
我将其实现为UIFont的一个类别。 - Legoless
@Legoless 那么它需要一个参数就非常令人困惑了。另外,? YES : NO 是什么鬼? - Nikolai Ruhe
显然,我没有复制粘贴这个方法。 ? 只是三元运算符,我觉得它没有任何问题。 - Legoless
@NikolaiRuhe 我并没有告诉你只需复制粘贴我的回答。我只是给了你一个想法。我这里没有发现任何错误。 - Tapas Pal
显示剩余6条评论

1

字体不仅仅由名称和大小组成。这里有一个更加详细的检查。注意:只适用于 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及更早版本中崩溃了。其次,@Legoless想要找出systemFont和customFont之间的区别。但是由于你使用了fontDescriptor,所以对于[UIFont systemFontOfSize:12.0][UIFont systemFontOfSize:13.0]它会返回false,这在这里是不需要的。 - Tapas Pal
@Legoless 只想知道使用的字体是系统字体还是其他字体。 - Tapas Pal

0

我已经创建了一个方法并在iOS 6iOS7中进行了测试。它运行良好,我得到了您期望的结果。

以下是代码:

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

希望对你有所帮助。


由于您每次都创建一个新的字体实例,这种方法的性能会如何? - Legoless
好问题。如果你不想每次创建实例,可以在.h文件中声明实例,并在viewDidLoad函数中进行声明。然后你可以在上面的函数中使用这个实例。 - Gaurav

0

只需检查fontName和/或familyName?

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

这只告诉我fontName。在iOS 6和iOS 7上是不同的。我猜我可以硬编码它们,但我想避免这样做。 - Legoless

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接