如何在iOS应用程序中将自定义字体族设置为系统字体

8
我正在开发一个iOS应用程序,需要在UI中使用自定义字体。我知道如何将新的自定义字体集成到应用程序中。为此,我需要:
  1. 下载带有.ttf扩展名的字体文件。
  2. 将它们添加到资源包中。
  3. 在info.plist文件中,使用Fonts provided by application键添加。
这样就可以显示自定义字体效果。但是我想要做的是将它们设置为系统字体,这样我就不必在所有UI元素中都设置它们。
我想要的是:
[[UIApplication sharedApplication] systemFont:@"Arial"];

这是可能的吗?有人能帮我吗?


现在已经弃用了以下代码:[[UILabel appearance] setFont:[UIFont fontWithName:@"YourFontName" size:17.0]];请查看StuartM的链接,那是一个好答案。 - brainray
1个回答

16

当我为iOS 7更新我的iOS应用程序时,我遇到了与您相同的问题。我想为整个应用程序设置自定义字体,甚至是那些您不能自定义字体的控件(例如选择器)。

经过在网络和Twitter上的一番研究,我使用了方法交换(Method Swizzling)来解决这个问题,它是一种用于交换方法实现的实践。

注意:如果不小心使用,这种方法可能很危险!请阅读Stack Overflow上的这个讨论:Danger of Method Swizzling

以下是具体步骤:

  1. 创建一个UIFont类别,比如UIFont+CustomSystemFont。
  2. 在.m文件中导入<objc/runtime.h>。
  3. 不修改.h文件,并将以下代码添加到.m文件中:
...
+(UIFont *)regularFontWithSize:(CGFloat)size
{
  return [UIFont fontWithName:@"Your Font Name Here" size:size];
}

+(UIFont *)boldFontWithSize:(CGFloat)size
{
  return [UIFont fontWithName:@"Your Bold Font Name Here" size:size];
}

// 方法混淆

+(void)load
{
    SEL original = @selector(systemFontOfSize:);
    SEL modified = @selector(regularFontWithSize:);
    SEL originalBold = @selector(boldSystemFontOfSize:);
    SEL modifiedBold = @selector(boldFontWithSize:);

    Method originalMethod = class_getClassMethod(self, original);
    Method modifiedMethod = class_getClassMethod(self, modified);
    method_exchangeImplementations(originalMethod, modifiedMethod);

    Method originalBoldMethod = class_getClassMethod(self, originalBold);
    Method modifiedBoldMethod = class_getClassMethod(self, modifiedBold);
    method_exchangeImplementations(originalBoldMethod, modifiedBoldMethod);
}

1
嘿,Matteodv!这是一项非常出色的工作,我给你100分。你为我节省了很多工作和时间...... - Jay Pandya
这符合苹果的指南吗?这肯定会帮助我... - Fábio Oliveira
是的,自从我使用这种方法更新了我的iOS 7应用程序并且没有遇到任何问题,所以它符合苹果的指南。 - matteodv
2
所有的视图都奇怪地不能正常工作:例如,在UITextView占位符中使用的字体仍然是原始的系统字体。你有解决办法吗? - Redwarp
我也遇到了同样的问题,请问 @Redwarp 有修复方法吗? - jamespick

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