iOS开发:如何在iPad应用中列出已安装的自定义字体
如何在iPad应用中识别并使用Adobe CC安装的自定义字体
问题背景
我正在开发一款iPad应用,想要使用设备上已安装的自定义字体。从Adobe Creative Cloud Suite下载了Cabin Sketch字体,安装后能在「设置>通用>字体」中看到,但用代码打印系统可用字体列表时,始终找不到这款字体。
我尝试过以下几种打印字体列表的代码:
方法1:使用CTFontDescriptor筛选已下载字体
NSDictionary *descriptorOptions = @{(id)kCTFontDownloadedAttribute : @YES}; // 也试过kCTFontDownloadableAttribute CTFontDescriptorRef descriptor = CTFontDescriptorCreateWithAttributes((CFDictionaryRef)descriptorOptions); CFArrayRef fontDescriptors = CTFontDescriptorCreateMatchingFontDescriptors(descriptor, NULL); for(UIFontDescriptor *descriptor in (NSArray *)CFBridgingRelease(fontDescriptors)) { NSString *fontFamilyName = [descriptor objectForKey:UIFontDescriptorFamilyAttribute]; NSLog(@"Font Family Name = %@", fontFamilyName); }
方法2:使用UIFont获取家族列表
NSArray *familyNames = [UIFont familyNames]; for (NSString *aFamilyName in familyNames) { NSArray *fontNames = [UIFont fontNamesForFamilyName:aFamilyName]; for (NSString *aFontName in fontNames) { NSLog(@"%@", aFontName); } }
方法3:使用CTFontManager获取可用家族名
QCFType<CFArrayRef> familyNames = CTFontManagerCopyAvailableFontFamilyNames(); for (NSString *familyName in familyNames.as<const NSArray *>()) NSLog(@"%@", familyName);
解决方案
1. 确认字体的实际识别名称
字体在系统设置中显示的名称和代码中需要用的内部名称可能不一致。可以通过Font Book(Mac端)或iOS字体查看工具,确认Cabin Sketch的PostScript名称或字体文件名。比如它的实际字体名可能是CabinSketch-Regular、CabinSketch-Bold,家族名可能是Cabin Sketch(注意空格)。
2. 专门获取用户安装的字体
使用CTFontManagerCopyFontDescriptorsWithAttributes筛选用户安装的字体,避免遗漏第三方工具安装的字体:
NSDictionary *filterAttributes = @{(id)kCTFontUserInstalledAttribute: @YES}; CFArrayRef userInstalledFonts = CTFontManagerCopyFontDescriptorsWithAttributes((CFDictionaryRef)filterAttributes); for (UIFontDescriptor *fontDesc in CFBridgingRelease(userInstalledFonts)) { NSString *familyName = fontDesc[UIFontDescriptorFamilyAttribute]; NSString *fontName = fontDesc[UIFontDescriptorNameAttribute]; NSLog(@"家族名:%@ | 字体名:%@", familyName, fontName); }
3. 直接尝试实例化字体
跳过列表查询,直接用可能的名称创建字体,验证是否能成功加载:
// 尝试不同的名称变体 NSString *possibleFontNames[] = {"CabinSketch-Regular", "Cabin Sketch", "CabinSketch"}; for (int i = 0; i < 3; i++) { UIFont *testFont = [UIFont fontWithName:possibleFontNames[i] size:18.0]; if (testFont) { NSLog(@"成功加载字体:%@", testFont.fontName); break; } }
4. 重启应用与设备
通过Adobe CC安装的字体可能需要系统同步时间,重启应用甚至设备,让系统重新扫描字体库,确保应用能获取到最新的字体列表。
5. 检查字体安装状态
前往「设置>通用>字体」,确认Cabin Sketch字体的状态为已安装(无“等待安装”或“安装失败”提示)。如果状态异常,重新从Adobe CC下载安装字体。
内容的提问来源于stack exchange,提问作者sivan
相关产品推荐
相关产品推荐

