8

我正在开发一个 ios 应用程序,在该应用程序中我必须为 UI 使用自定义字体。我知道如何在应用程序中集成新的自定义字体。为此我有

  1. 下载扩展名为 .ttf 的字体系列文件。
  2. 将它们添加到资源包。
  3. 在 info.plist 文件中添加应用程序提供的关键字体。

此自定义字体显示效果。但我想做的是,我想将它们设置为 systemFont。所以我不必在所有 UI 元素中设置它们。

我想要类似的东西

[[UIApplication sharedApplication] systemFont:@"Arial"];

这可能吗?谁能帮我这个?

4

1 回答 1

16

在为 iOS 7 更新我的 iOS 应用程序时,我遇到了同样的问题。我想为整个应用程序设置自定义字体,即使对于不允许自定义字体的控件(例如选择器)。
在网络和 Twitter 上进行了一些研究之后,我使用 Method Swizzling 解决了这个问题,这是一种包含交换方法实现的实践。

注意:如果不小心使用,此方法可能会很危险!阅读关于 SO 的讨论:方法混杂的危险

但是,这是要做的:

  1. 创建一个 UIFont 类别,例如 UIFont+CustomSystemFont。
  2. 导入<objc/runtime.h>您的 .m 文件。
  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);
}
于 2013-10-23T18:22:40.860 回答