ios - 我可以在iPhone应用程序中嵌入自定义字体吗?




cocoa-touch fonts (20)

这个问题涉及iOS 3.2之前的版本。 从3.2开始,使用samvermette的答案很容易实现此功能,并且我已将接受的答案(从命令改为samvermette)反映出来。 我不能赞扬这两个答案(除了upvotes),但他们都很好。

我希望有一个应用程序包含用于呈现文本的自定义字体,加载它,然后将其与标准UIKit元素(如UILabel 。 这可能吗?

我发现下面的链接:

但是这些都需要我自己渲染每个字形,这有点像辛勤工作,特别是对于多行文本。

我还发现一些文章说明这是不可能的,但没有理由,所以我正在寻找一个明确的答案。

编辑 - 失败-[UIFont fontWithName:size:]实验

我下载了Harrowprint.tff(从here下载)并将其添加到我的资源目录和项目中。 然后我尝试了这段代码:

UIFont* font = [UIFont fontWithName:@"Harrowprint" size:20];

导致抛出异常。 查看Finder中的TTF文件,确认字体名称为Harrowprint。

编辑 - 到目前为止,已经有了很多回复,这些回复告诉我要阅读X或Y上的文档。我对这些内容进行了广泛的实验,并没有得到任何答案。 在一个案例中,X被证明仅适用于OS X,而不是iPhone。 因此,我为这个问题设置了奖励,并且我将奖励给第一个提供答案的人(仅使用记录的API),他们以足够的信息做出响应,以便在设备上正常工作。 在模拟器上工作也是一个好处。

编辑 - 看来,赏金自动奖励的答案与最高票数。 有趣。 没有人真正提供了解决问题的答案 - 问题涉及编码自己的UILabel子类的解决方案不支持自动换行,这对我来说是一个基本功能 - 尽管我想我可以扩展它来这样做。


Swift, code way: (works also with swift 2.0)

Add the required fonts to your project (just like adding images, just drag to Xcode), make sure that they are targeted to your project
add this method and load custom fonts (recommended in appDelegate didFinishLaunchingWithOptions )

func loadFont(filePath: String) {

    let fontData = NSData(contentsOfFile: filePath)!

    let dataProvider = CGDataProviderCreateWithCFData(fontData)
    let cgFont = CGFontCreateWithDataProvider(dataProvider)!

    var error: Unmanaged<CFError>?
    if !CTFontManagerRegisterGraphicsFont(cgFont, &error) {
        let errorDescription: CFStringRef = CFErrorCopyDescription(error!.takeUnretainedValue())
        print("Unable to load font: %@", errorDescription, terminator: "")
    }

}

Use example:

if let fontPath = NSBundle.mainBundle().pathForResource("My-Font", ofType: "ttf"){
      loadFont(fontPath)
}

Use the font:

UIFont(name: "My-Font", size: 16.5)

iOS 3.2和更高版本支持这一点。 直接从iPhone OS 3.2 doc 的新功能

自定义字体支持
想要使用自定义字体的应用程序现在可以在应用程序包中包含这些字体,并通过在Info.plist文件中包含UIAppFonts键将这些字体注册到系统中。 这个键的值是一串字符串,标识应用程序包中的字体文件。 系统看到密钥时,会加载指定的字体并使其可供应用程序使用。

一旦在Info.plist设置了字体,您可以使用自定义字体作为IB中的任何其他字体或以编程方式使用。

Apple开发者论坛上有一个正在进行的讨论:
https://devforums.apple.com/thread/37824 (需要登录)

这里有一个很好的简单的3步教程,介绍如何实现这一点(断开的链接删除)

  1. 将您的自定义字体文件添加到使用Xcode作为资源的项目中
  2. 向您的Info.plist文件中添加一个名为UIAppFonts
  3. 使这个键成为一个数组
  4. 对于每种字体,请输入字体文件的全名(包括扩展名)作为UIAppFonts阵列的项目
  5. 保存Info.plist
  6. 现在在你的应用程序中,你可以简单地调用[UIFont fontWithName:@"CustomFontName" size:12]来获得用于你的UILabelsUITextView等的自定义字体。

另外:确保字体在你的拷贝包资源中。


编辑:这个答案从iOS3.2开始已经失效; 使用UIAppFonts

我能够成功加载自定义UIFont的唯一方法是通过私有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;
}

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

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

Although some of the answers above are correct, I have written a detailed visual tutorial for people still having problems with fonts.

The solutions above which tell you to add the font to the plist and use

[self.labelOutlet setFont:[UIFont fontWithName:@"Sathu" size:10]];

are the correct ones. Please do now use any other hackish way. If you are still facing problems with finding font names and adding them, here is the tutorial -

Using custom fonts in ios application


You can add the required "FONT" files within the resources folder. Then go to the Project Info.plist file and use the KEY "Fonts provided by the application" and value as "FONT NAME".

Then you can call the method [UIFont fontwithName:@"FONT NAME" size:12];


yes you can use custom font in your application

step by step following there:

Add your custom font files into your project in supporting files

Add a key to your Info.plist file called UIAppFonts.

Make this key an array

For each font you have, enter the full name of your font file (including the extension) as items to the UIAppFonts array

Save Info.plist Now in your application you can simply call [UIFont fontWithName:@"your Custom font Name" size:20] to get the custom font to use with your UILabels after applying this if your not getting correct font then you double click on the custom font , and see carefully top side font name is comming and copy this font , paste, here [UIFont fontWithName:@" here past your Custom font Name" size:20]

i hope you will get correct answer


也许作者忘了给这个字体一个Mac FOND的名字

  1. FontForge打开字体,然后转到元素>字体信息
  2. 有一个“Mac”选项,您可以在其中设置FOND名称。
  3. 在File> Export Font下,您可以创建一个新的ttf

您也可以尝试在导出对话框中输入“Apple”选项。

免责声明 :我不是iPhone开发者!


从iOS 4.1开始,有一种使用自定义字体的新方法。 它允许您动态加载字体,无论是来自应用程序中包含的文件,下载的数据还是您拥有的字体。 它还允许您在需要时加载字体,而旧方法在应用程序启动时加载它们,如果您有许多字体,则该方法可能需要很长时间。

新方法在ios-dynamic-font-loading

您使用CTFontManagerRegisterGraphicsFont函数,为您的字体数据提供一个缓冲区。 然后,就像旧方法一样,它可用于UIFont和Web视图。 以下是该链接的示例代码:

NSData *inData = /* your font-file data */;
CFErrorRef error;
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)inData);
CGFontRef font = CGFontCreateWithDataProvider(provider);
if (! CTFontManagerRegisterGraphicsFont(font, &error)) {
    CFStringRef errorDescription = CFErrorCopyDescription(error)
    NSLog(@"Failed to load font: %@", errorDescription);
    CFRelease(errorDescription);
}
CFRelease(font);
CFRelease(provider);

借助iOS 8 +和Xcode 6 +,您可以轻松完成此任务。 这里是步骤:

1)将您的字体拖放到Xcode Supporting Files文件夹。 不要忘记在“ 添加到目标”部分标记您的应用。 从这一刻起,您可以在IB使用该字体,并从字体托盘中选择它。

2)要使您的设备可以使用此字体,请打开您的info.plist并添加Fonts provided by application密钥Fonts provided by application 。 它将包含项目0键,您必须添加您的字体名称作为值。 字体名称可能因您的字体文件名而异。 但首先,尝试在大多数情况下添加您的文件名这项工作。

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

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

func allFonts(){

   for family in UIFont.familyNames(){

       println(family)


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

   }

}

编辑

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

例如,我遇到一个bug ,当UITextField有自定义字体时,但是这个字体不在复制包资源中 。 当我用这个textfield继续到viewcontroller textfield ,在调用viewDidLoad函数之前大约4秒钟有一个延迟。 解决字体问题消除了这种延迟。 所以,建议检查两次。 (rdar:// 20028250)顺便说一下,我无法重现该错误,但我确信问题出在了字体上。


在Info.plist中添加条目“由应用程序提供的字体”,并将字体名称包含为字符串:

Fonts provided by application
           Item 0        myfontname.ttf
           Item 1        myfontname-bold.ttf
           ...

然后检查以确保您的字体包含在运行中:

for (NSString *familyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
         NSLog(@"%@", fontName);
    }
}

请注意,您的ttf文件名称可能与您为标签设置字体时使用的名称不同(您可以使用上面的代码获取“fontWithName”参数):

[label setFont:[UIFont fontWithName:@"MyFontName-Regular" size:18]];

在现有的iOS应用程序中添加新字体非常简单。

你只需要将字体例如font.ttf添加到你的资源文件夹中。

打开你的应用程序info.plist 。 将一个新行添加为“应用程序提供的字体”,并将字体名称输入为font.ttf。

而当设置字体做为setFont:"corresponding Font Name"

您可以通过NSArray *check = [UIFont familyNames];检查您的字体是否已添加NSArray *check = [UIFont familyNames];

它将返回应用程序支持的所有字体。


如果您使用的是xcode 4.3 ,则必须在线程Custom Fonts Xcode 4.3中根据https://.com/users/1292829/arne将该font添加到Copy Bundle Resources下的Build Phase 。 这对我有效,下面是我为自定义字体在我的应用中工作的步骤:

  1. 将字体添加到您的项目。 我将OTF (或TTF )文件拖放到我创建的新组中,并接受xcode copying the files over to the project folder
  2. 创建UIAppFonts阵列,并将您的字体列为阵列中的项目。 只是names ,而不是扩展名(例如“ GothamBold ”,“ GothamBold-Italic ”)。
  3. 点击屏幕左侧Project Navigator顶部的project name方式。
  4. 点击xcode主区域中的Build Phases选项卡。
  5. 展开“ Copy Bundle Resources ”部分并点击"+"添加字体。
  6. 从点击"+"时弹出的文件导航器中选择字体文件。
  7. 为每个你必须add to the project字体执行此操作。

对于iOS 3.2及更高版本:使用以上几种方法提供的方法:

  1. 将您的字体文件(例如Chalkduster.ttf )添加到XCode中项目的Resources文件夹。
  2. 打开info.plist并添加一个名为UIAppFonts的新密钥。 这个键的类型应该是数组。
  3. 将您的自定义字体名称添加到此数组中,包括扩展名(“ Chalkduster.ttf ”)。
  4. 在应用程序中使用[UIFont fontWithName:@"Real Font Name" size:16]

但是 “真正的字体名称”并不总是你在Fontbook中看到的。 最好的方法是询问你的设备看到的字体和确切的名字。

我使用uifont-name-grabber发布的uifont-name-grabber

只需将所需的字体放入xcode项目中,将文件名添加到plist中,然后在您正在构建的设备上运行它,它将使用UIFont fontWithName:期望的名称向您发送完整字体列表。


我一直在尝试iOS 3.1.2上这个页面上的各种建议,这些是我的结论:

即使FOND名称是使用FontForge设置的,只需在Resources目录中使用[UIFont fontWithName:size:]与字体即可。

如果首先使用GSFontAddFromFile加载字体,则[UIFont fontWithName:size:]将可用。 但GSFontAddFromFile不是iOS 3.1.2的一部分,因此必须按照@rpetrich所述进行动态加载。


我做了这样的事情:

加载字体:

- (void)loadFont{
  // Get the path to our custom font and create a data provider.
  NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"mycustomfont" ofType:@"ttf"]; 
  CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]);

  // Create the font with the data provider, then release the data provider.
  customFont = CGFontCreateWithDataProvider(fontDataProvider);
  CGDataProviderRelease(fontDataProvider); 
}

现在,在你的drawRect: ,做这样的事情:

-(void)drawRect:(CGRect)rect{
    [super drawRect:rect];
    // Get the context.
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, rect);
    // Set the customFont to be the font used to draw.
    CGContextSetFont(context, customFont);

    // Set how the context draws the font, what color, how big.
    CGContextSetTextDrawingMode(context, kCGTextFillStroke);
    CGContextSetFillColorWithColor(context, self.fontColor.CGColor);
    UIColor * strokeColor = [UIColor blackColor];
    CGContextSetStrokeColorWithColor(context, strokeColor.CGColor);
    CGContextSetFontSize(context, 48.0f);

    // Create an array of Glyph's the size of text that will be drawn.
    CGGlyph textToPrint[[self.theText length]];

    // Loop through the entire length of the text.
    for (int i = 0; i < [self.theText length]; ++i) {
        // Store each letter in a Glyph and subtract the MagicNumber to get appropriate value.
        textToPrint[i] = [[self.theText uppercaseString] characterAtIndex:i] + 3 - 32;
    }
    CGAffineTransform textTransform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
    CGContextSetTextMatrix(context, textTransform);
    CGContextShowGlyphsAtPoint(context, 20, 50, textToPrint, [self.theText length]);
}

基本上你必须在文本中做一些强力循环,然后使用幻数来找出字体中的偏移量(这里,请参阅使用29),但它可以工作。

此外,你必须确保字体在法律上是可嵌入的。 大多数不是,也有专门从事这类事情的律师,所以要警告。


我已经将这个页面上的一些建议合并到了适用于iOS 5的某些内容中。

首先,您必须将自定义字体添加到您的项目中。 然后,您需要遵循@iPhoneDev的建议并将该字体添加到您的info.plist文件中。

你这样做后,这个工作:

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

但是,您需要知道字体的Postscript名称。 只要按照@丹尼尔伍德的建议,并在FontBook中按下命令即可。

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


是的,你可以包含自定义字体。 请参阅UIFont上的文档,特别是fontWithName:size:方法。

1)确保你的资源文件夹中包含字体。

2)字体的“名称”不一定是文件名。

3)确保您拥有使用该字体的合法权利。 通过将其包含在您的应用中,您也可以发布它,并且您需要有权这样做。


更好的解决方案是将一个新的属性“ Fonts provided by application ”添加到您的info.plist文件中。

然后,您可以像使用普通的UIFont一样使用自定义字体。


查找ATSApplicationFontsPath

一个简单的plist条目,允许您将字体文件包含在应用程序资源文件夹中,并且它们在您的应用程序中“正常工作”。


首先将.odt格式的字体添加到资源中,在这种情况下,我们将使用DINEngschriftStd.otf,然后使用此代码将字体分配给标签

[theUILabel setFont:[UIFont fontWithName:@"DINEngschriftStd" size:21]];

为了确保你的字体在项目上加载,只需调用

NSLog(@"Available Font Families: %@", [UIFont familyNames]);

在.plist上,您必须声明字体。 只需添加'应用程序提供的字体'记录,并添加一个项目0字符串的字体名称(DINEngschriftStd.otf)







fonts