20

给定 UIFont 或 CTFont,我如何判断字体是粗体/斜体?

4

4 回答 4

45

iOS7 字体描述符

没有理由使用 Core Text,你可以简单地向 UIFont 询问 fontDescriptor。

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

展望未来,这可能是询问字体特征的最简单方法。

于 2013-12-11T09:31:32.917 回答
36

如果你想用Swift 2.0做到这一点:

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

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

用法:

let font: UIFont = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)
if font.isBold {
  print("it's bold..")
}
于 2016-02-25T15:36:50.323 回答
35

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

给定字体 a 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);
于 2011-07-10T04:28:08.397 回答
9

Swift 3/4的答案基于 Arjan 的回答:

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

    var isItalic: Bool {
        return fontDescriptor.symbolicTraits.contains(.traitItalic)
    }
}
于 2018-04-20T04:59:56.170 回答