我想有一个应用程序包括一个自定义字体渲染文本,加载它,然后使用它与标准UIKit元素如UILabel。这可能吗?


当前回答

我把本页上的一些建议组合成适合我在iOS 5上使用的东西。

首先,您必须将自定义字体添加到项目中。然后,您需要按照@iPhoneDev的建议,将字体添加到您的信息中。plist文件。

在你这样做之后,这是有效的:

UIFont *yourCustomFont = [UIFont fontWithName:@"YOUR-CUSTOM-FONT-POSTSCRIPT-NAME" size:14.0];
[yourUILabel setFont:yourCustomFont];

但是,您需要知道字体的Postscript名称。只要遵循@Daniel Wood的建议,在FontBook中按command-i即可。

然后,享受您的自定义字体。

其他回答

查找ATSApplicationFontsPath

一个简单的plist条目,允许你在你的应用程序资源文件夹中包括字体文件,他们“只是工作”在你的应用程序中。

这是如何做这件事的一步一步的说明。不需要额外的库或任何特殊的编码。

http://shang-liang.com/blog/custom-fonts-in-ios4/

大多数时候问题在于字体而不是方法。最好的方法是使用一种肯定有效的字体,比如verdana或geogia。然后更改为想要的字体。如果它不起作用,可能是字体名称不正确,或者字体格式不正确。

您可以在资源文件夹中添加所需的“FONT”文件。然后转到项目信息。plist文件,并使用键“Fonts provided by the application”和值“FONT NAME”。

然后你可以调用方法[UIFont fontwithName:@"FONT NAME" size:12];

编辑:这个答案在iOS3.2失效;使用UIAppFonts

我能够成功加载自定义UIFonts的唯一方法是通过私有的GraphicsServices框架。

下面将加载应用程序主包中的所有.ttf字体:

BOOL GSFontAddFromFile(const char * path);
NSUInteger loadFonts()
{
    NSUInteger newFontCount = 0;
    for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
        newFontCount += GSFontAddFromFile([fontFile UTF8String]);
    return newFontCount;
}

一旦字体被加载,它们就可以像apple提供的字体一样使用:

NSLog(@"Available Font Families: %@", [UIFont familyNames]);
[label setFont:[UIFont fontWithName:@"Consolas" size:20.0f]];

GraphicsServices甚至可以在运行时加载,以防API在未来消失:

#import <dlfcn.h>
NSUInteger loadFonts()
{
    NSUInteger newFontCount = 0;
    NSBundle *frameworkBundle = [NSBundle bundleWithIdentifier:@"com.apple.GraphicsServices"];
    const char *frameworkPath = [[frameworkBundle executablePath] UTF8String];
    if (frameworkPath) {
        void *graphicsServices = dlopen(frameworkPath, RTLD_NOLOAD | RTLD_LAZY);
        if (graphicsServices) {
            BOOL (*GSFontAddFromFile)(const char *) = dlsym(graphicsServices, "GSFontAddFromFile");
            if (GSFontAddFromFile)
                for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
                    newFontCount += GSFontAddFromFile([fontFile UTF8String]);
        }
    }
    return newFontCount;
}

在iOS 8+和Xcode 6+中,你可以很容易地做到这一点。以下是步骤:

1)拖拽你的字体到Xcode支持文件文件夹。不要忘记在添加到目标部分标记你的应用程序。从这一刻起,你可以在IB中使用这种字体,并从字体托盘中选择它。

2)要使此字体在您的设备中可用,请打开您的信息。plist和添加由应用程序键提供的字体。它将包含Item 0键,您必须添加您的字体名称作为值。字体名称可以与您的字体文件名不同。但首先,在大多数情况下,尝试添加您的文件名。

如果没有,这篇文章总是帮助我。

下面是本文中的代码片段,可以帮助您找到字体名称。

func allFonts(){

   for family in UIFont.familyNames(){

       println(family)


       for name in UIFont.fontNamesForFamilyName(family.description)
       {
           println("  \(name)")
       }

   }

}

EDIT

我想说的是,你需要将字体文件添加到你的目标构建阶段,复制捆绑资源。没有它,你将看不到你的字体在设备上。这可能会导致意想不到的行为。

例如,我遇到了一个错误,当UITextField有自定义字体,但这种字体不在复制Bundle资源。当我用这个文本框segue到视图控制器时,在viewDidLoad函数被调用之前有大约4秒的延迟。解决字体问题消除了这种延迟。所以,建议检查两遍。(rdar://20028250) Btw,我无法重现错误,但我确信问题是字体。