ios - 如何找到包含给定字符的字体?

标签 ios iphone objective-c cocoa-touch

我有一种用于我的应用程序的字体,它只使用英文字符。我使用 CoreText 来显示文本,我注意到每当有人输入字体中未包含的字符(如阿拉伯字符)时,程序就会卡在这一行:

CTFramesetterCreateFrame(textFramesetter, CFRangeMake(0, 0), textMutablePath, NULL); 

我有几个问题:

  1. 是否可以知道某个字符是否包含在字体中?
  2. 系统能否找到包含未知字符的字体?

相关:Check if certain character is supported by UIFont

最佳答案

1) 是否可以知道字体中是否包含某个字符?

BOOL FontContainsCharacter(UIFont *font, unichar character) {
    NSCharacterSet *characterSet = [font.fontDescriptor objectForKey:UIFontDescriptorCharacterSetAttribute];
    return [characterSet characterIsMember:character];
}

2) 系统是否可以找到包含未知字符的字体?

NSArray *FontDescriptorsForFontsContainingCharactersInString(NSString *string) {
    NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:string];
    NSDictionary *fontAttributes = @{UIFontDescriptorCharacterSetAttribute:characterSet};
    UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithFontAttributes:fontAttributes];
    return [fontDescriptor matchingFontDescriptorsWithMandatoryKeys:nil];
}

例如:

NSLog(@"%d", FontContainsCharacter([UIFont fontWithName:@"Helvetica" size:12], 0x0041)); // "A"
NSLog(@"%d", FontContainsCharacter([UIFont fontWithName:@"Helvetica" size:12], 0x4F60)); // "你"

for (UIFontDescriptor *fontDescriptor in FontDescriptorsForFontsContainingCharactersInString(@"你好")) {
    NSLog(@"%@", [UIFont fontWithDescriptor:fontDescriptor size:12].fontName);
}

输出:

1
0
STHeitiSC-Light
STHeitiSC-Medium
STHeitiTC-Light
STHeitiTC-Medium
HiraKakuProN-W3
HiraKakuProN-W6
HiraMinProN-W3
HiraMinProN-W6

关于ios - 如何找到包含给定字符的字体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20735902/

相关文章:

ios - UITableView 决定单个行高

ios - 如何更改已上传的 Firebase 存储图像文件名?

ios - 如何在swift中使用 ImageView 生成随机图像

ios - 使 iPhone 屏幕变暗

iphone - 如何在iPhone应用程序中使用sqlite prepare语句在Sqlite数据库中插入数据

ios - UITextField 切断了文本的右侧,并且没有在正确的位置显示光标

ios - 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因 : '-[__NSCFString size]: unrecognized selector sent to instance

objective-c - 音频播放的准确(音乐级)计时

ios - IOS 中的 WebRTC 视频和音频不适用于 3G/4G,但适用于 WIFI

ios - 在Swift中,如何避免同时使用 optional 对象和nil对象引用?