我想有一个应用程序包括一个自定义字体渲染文本,加载它,然后使用它与标准UIKit元素如UILabel。这可能吗?
当前回答
在你现有的iOS应用程序上添加一个新的字体是非常容易的。
你只需要添加字体,如font.ttf到你的资源文件夹。
打开应用程序info.plist。添加一个新行作为“Fonts provided by application”,并输入字体名称为font.ttf。
设置字体时执行setFont:"相应字体名称"
你可以通过NSArray *check = [UIFont familyNames];来检查你的字体是否被添加。
它返回应用程序支持的所有字体。
其他回答
编辑:这个答案在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,我无法重现错误,但我确信问题是字体。
一个重要的注意事项:您应该使用与字体相关的“PostScript名称”,而不是其全名或家族名称。此名称通常与字体的正常名称不同。
虽然上面的一些答案是正确的,但我已经为那些仍然对字体有问题的人写了一个详细的可视化教程。
上面的解决方案告诉你将字体添加到plist并使用
[self.labelOutlet setFont:[UIFont fontWithName:@"Sathu" size:10]];
都是正确的。现在请使用任何其他的黑客方式。如果您仍然面临查找字体名称和添加它们的问题,这里是教程-
在ios应用程序中使用自定义字体
我做了一切可能,但新的字体不出现,所以我找到了解决方案:
当你拖动fot文件(otf或ttf)时,不要忘记勾选“添加到目标”下的复选框。
这样做之后,你的字体就会出现,一切都会正常工作。
推荐文章
- 我如何在网站上使用谷歌的Roboto字体?
- iPhone上UIView和UILabels的渐变
- keychain上的分发证书中缺少私钥
- 在实现API时,我如何避免在块中捕获自我?
- 如何确定浏览器渲染文本时实际使用的字体?
- 如何创建一个Swift Date对象?
- Xcode 4在目标设备上说“finished running <my app>”——什么都没有发生
- 从另一个应用程序打开设置应用程序
- 快速提取正则表达式匹配
- 如何应用梯度的背景视图的iOS Swift应用程序
- 图书馆吗?静态的?动态吗?或框架?另一个项目中的项目
- 如何用SwiftUI调整图像大小?
- Xcode 6 gitignore文件应该包括什么?
- 如何在iPhone/iOS上删除电话号码的蓝色样式?
- 检测视网膜显示