0

我知道我可以使用 获取字体家族名称列表,[UIFont familyNames]并使用 遍历家族的字体名称[UIFont fontNamesForFamilyName:]。有什么方法可以判断哪个字体名称代表“正常”字体?命名没有任何一致性(“罗马”,“常规”,甚至没有修饰形容词)。我最终试图在一个子字符串上更改字体,NSAttributedString同时保持现有的特征和装饰。提前致谢。

4

2 回答 2

1

好吧,我需要更仔细地阅读 CoreText 文档。如果您使用正确的 CoreText 例程,则传入字体系列名称就足够了......

NSString *fontFamilyName = ...(font family name)...;
// Make a mutable copy of the attributed text
NSMutableAttributedString *workingAttributedText = [self.attributedText mutableCopy];

// Over every attribute run in the selected range...
[workingAttributedText enumerateAttributesInRange:self.selectedRange
    options:(NSAttributedStringEnumerationOptions) 0
    usingBlock:^(NSDictionary *attrs, NSRange range, BOOL *stop) {
        // get the old font
        CTFontRef oldFont = (__bridge CTFontRef)[attrs objectForKey:NSFontAttributeName];
        // make a new one, with our new desired font family name
        CTFontRef newFontRef = CTFontCreateCopyWithFamily(oldFont, 0.0f, NULL, (__bridge CFStringRef)fontFamilyName);
        // Convert it to a UIFont
        UIFont *newFont = [UIFont fontWithCTFont:newFontRef];
        // Add it to the attributed text
        [workingAttributedText addAttribute:NSFontAttributeName value:newFont range:range];
    }];

// Replace the attributed text with the new version
[self setAttributedText:workingAttributedText];

如果有更简单的方法可以做到这一点,我很想听听。

于 2013-01-29T21:02:07.120 回答
0

列表中不必有常规字体。有些可能只提供粗体或仅斜体。这就是为什么经常将列表提供给用户让他们做出决定的原因。

于 2013-01-29T18:14:52.610 回答