检测字体在iOS上是否为粗体/斜体?

oalqel3c  于 2023-01-03  发布在  iOS
关注(0)|答案(4)|浏览(177)

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

ou6hu8tu

ou6hu8tu1#

iOS7字体描述符

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

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

接下来,这可能是询问字体特征的最简单方法。

rm5edbpk

rm5edbpk2#

如果要使用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..")
}
sr4lhrrt

sr4lhrrt3#

查看字体名称并不总是有效的。考虑字体“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);
brjng4g3

brjng4g34#

根据Arjan的答案回答Swift 3/4

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

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

相关问题