从iOS 13开始,CTFontManager
具有以下功能:
@discussion Font assets are extracted from the asset catalog and registered. This call must be made after the completion handler of either NSBundleResourceRequest beginAccessingResourcesWithCompletionHandler: or conditionallyBeginAccessingResourcesWithCompletionHandler: is called successfully.
Name the assets using Postscript names for individual faces, or family names for variable/collection fonts. The same names can be used to unregister the fonts with CTFontManagerUnregisterFontDescriptors. In iOS, fonts registered with the persistent scope are not automatically available to other processes. Other process may call CTFontManagerRequestFonts to get access to these fonts.
@param fontAssetNames
Array of font name assets in asset catalog.
...
CTFontManagerRegisterFontsWithAssetNames(_ fontAssetNames: CFArray, _ bundle: CFBundle?, _ scope: CTFontManagerScope, _ enabled: Bool, _ registrationHandler: ((CFArray, Bool) -> Bool)?)
然而,资产目录没有任何方式添加“字体资产”。
我试过的:
kanitregular.ttf
(后记名称为kanit-regular
)。kanit-regular
的数据资产。kanit-regular.ttf
并将其放入数据资产。数据资产的contents.json
现在如下所示:
{
"data" : [
{
"filename" : "Kanit-Regular.ttf",
"idiom": "universal",
"universal-type-identifier" : "public.truetype-ttf-font"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
CTFontManager
像这样:
func registerFont() {
var cfBundle: CFBundle?
if let bundle = Bundle(for: type(of: self)) {
cfBundle = CFBundleCreate(kCFAllocatorDefault, bundle.bundleURL as CFURL)
}
CTFontManagerRegisterFontsWithAssetNames(["Kanit-Regular"] as CFArray, cfBundle, .persistent, true) { (errors, done) -> Bool in
print(errors)
return done
}
}
在此之后,打印错误
:
▿ 1 element
- 0 : Error Domain=NSPOSIXErrorDomain Code=22 "Invalid argument" UserInfo={CTFontManagerErrorFontAssetNameKey=(
"Kanit-Regular"
)}
有什么办法让它起作用吗?
通过以下操作使其工作:
字体
按需资源标记来标记KANIT-Regular
数据资产(标记名称可以是您首选的名称,字体
只是示例)。字体
标记放入初始安装标记
预取资源标记部分签名和功能
中添加字体
功能,并在其中的所有框中打勾像这样:
func registerFont() {
var cfBundle: CFBundle?
var resourceRequest: NSBundleResourceRequest?
if let bundle = Bundle(for: type(of: self)) {
resourceRequest = NSBundleResourceRequest(tags: Set(arrayLiteral: "fonts"), bundle: bundle)
cfBundle = CFBundleCreate(kCFAllocatorDefault, bundle.bundleURL as CFURL)
}
resourceRequest?.beginAccessingResources() { error in
if let error = error {
print(error)
} else {
CTFontManagerRegisterFontsWithAssetNames(["Kanit-Regular"] as CFArray, cfBundle, .persistent, true) { (errors, done) -> Bool in
print(errors)
return done
}
}
}
}
结果
当作用域作为.persistent
或.user
传递时,在初始调用CTFontManagerRegisterFontsWithAssetNames
函数时,将要求用户将字体安装到系统中,这不是我真正需要的。如果范围是.process
或.none
,则返回与问题末尾提供的相同的errors
输出。
虽然这个函数不符合我的需要,但我至少验证了它是工作的。也许有人会觉得有用。
当我尝试以编程方式将资产中的.ttf文件中的自定义字体设置为android应用中的按钮时,它返回由以下原因引起的错误:java.lang.RuntimeException:font asset找不到Fonts/MenuButton.ttf。Assets文件夹在主目录中,我使用了以下代码:Typeface tpf=Typeface.createFromAsset(this.getAssets(),“
loginpage.dart 资产档案包括 错误是 在pubspec中检测到错误。yaml:未找到资产:资产/图像的文件或变体。 失败:构建失败,有一个异常。 > 其中:脚本'C:\Src\flatter\packages\flatter\u tools\gradle\flatter。格雷德尔线:991 错误:任务“:app:compileFlutterBuildDebug”的执行失败。 处理“命
我知道我将文本文件放在了assets\chat1的位置。txt,我的代码也可以与其他txt一起使用,但不知何故,我总是遇到以下错误: 发生异常。 错误(无法加载资产:assets/chat1.txt) 我的代码: pubspec.yaml
我已经在android项目目录的资产文件夹中添加了html和css文件,我想从新的字体支持中加载一种字体,即font/somefont。ttf公司 我尝试过添加不同的方法,但没有一种方法像这里所解释的那样使用Android中WebView的自定义字体 它应该提供apply字体,但我在控制台中遇到此异常 并且没有加载字体。
问题内容: 由于棒棒糖的某种原因,我遇到了这个错误,由于棒棒糖太新了,我无法找到原因,而且我也不知道如何解决。在此先感谢Logcat错误: 编辑:这是引发错误的代码 我的项目文件夹中的资产文件夹中有helvetica.ttf。 编辑:此应用程序在5.0之前的所有设备上均可运行,因此由于某些原因5.0无法识别我的资产文件夹中的文件。 我试图将其屏幕截图发布到我的资产文件夹中,但是我没有足够的声誉来发
问题内容: 我的资产文件夹中有一个文件…我该如何阅读? 现在我正在尝试: 但是它抛出了一个空指针异常… 该文件称为“原始文件”,它位于文件夹资产中 我尝试使用以下方法进行投射: 和 但是都失败了…有什么建议吗? 问题答案: 您可以使用打开输入流。 是该类的一种方法。 还要注意,您不应该重新创建字符缓冲区(,循环的最后一行)。