在iOS上如何检测字体是否为加粗/倾斜?

21

如何判断一个UIFont或CTFont是否为粗体/斜体?

4个回答

45

iOS7字体描述符

没有使用核心文本的必要,您可以简单地向UIFont请求fontDescriptor。

        UIFont *font = [UIFont boldSystemFontOfSize:17.0f];
        UIFontDescriptor *fontDescriptor = font.fontDescriptor;
        UIFontDescriptorSymbolicTraits fontDescriptorSymbolicTraits = fontDescriptor.symbolicTraits;
        BOOL isBold = (fontDescriptorSymbolicTraits & UIFontDescriptorTraitBold) != 0;

从现在开始,这可能是询问字体特征最简单的方式。


不要将 uint32_t 强制转换为 BOOL,否则会引起问题。相反,请使用 BOOL isBold = (fontDescriptorSymbolicTraits & UIFontDescriptorTraitBold) != 0BOOL isBold = !!(fontDescriptorSymbolicTraits & UIFontDescriptorTraitBold) - Jeffery Thomas

40

如果您想使用 Swift 完成此操作:

extension UIFont {
    var isBold: Bool {
        return fontDescriptor.symbolicTraits.contains(.traitBold)
    }
    
    var isItalic: Bool {
        return fontDescriptor.symbolicTraits.contains(.traitItalic)
    }
}

用法:

let font: UIFont = UIFont.preferredFont(forTextStyle: .headline)
if font.isBold {
  print("it's bold..")
}

13
@JanGreve请重新考虑您的反对票,当有新的解决方案可用时回答旧问题是一件好事,我添加了Swift标签以增加清晰度。 - Arjan
4
我再次删除了Swift标签。作者不可能想要询问有关Swift的问题,因此您的编辑明显与作者的意图相冲突。除此之外,您是正确的;一个新的Objective-C技术应该是可以的。 - Tobi Nary
3
注:此事目前正被讨论于 Meta(http://meta.stackoverflow.com/questions/317716/are-only-tags-allowed-that-the-author-could-have-intended),@Jan 参与其中。 - Shog9

35

仅查看字体名称并不总是起作用。考虑字体“Courier Oblique”(斜体)或“HoeflerText-Black”(粗体),它们的名称中都不包含“粗体”或“斜体”。

给定一个CTFontRef作为字体,确定它是否为粗体或斜体的正确方法是使用CTFontGetSymbolicTraits函数:

CTFontRef font = CTFontCreateWithName((CFStringRef)@"Courier Oblique", 10, NULL);
CTFontSymbolicTraits traits = CTFontGetSymbolicTraits(font);
BOOL isItalic = ((traits & kCTFontItalicTrait) == kCTFontItalicTrait);
BOOL isBold = ((traits & kCTFontBoldTrait) == kCTFontBoldTrait);
NSLog(@"Italic: %i Bold: %i", isItalic, isBold);
CFRelease(font);

谢谢,我认为这是一种非常干净的方法。还有一个问题。假设我有一个CTFont,如何使它加粗? - aryaxt
1
使用CTFontCreateCopyWithSymbolicTraits函数。 - omz
isItalic 无法与 Superclarendon、Marion 和 Gill Sans 字体一起使用。 - Shmidt

11

根据Arjan的回答,针对Swift 3/4的答案是:

extension UIFont {
    var isBold: Bool {
        return fontDescriptor.symbolicTraits.contains(.traitBold)
    }

    var isItalic: Bool {
        return fontDescriptor.symbolicTraits.contains(.traitItalic)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接