如何判断一个UIFont或CTFont是否为粗体/斜体?
没有使用核心文本的必要,您可以简单地向UIFont请求fontDescriptor。
UIFont *font = [UIFont boldSystemFontOfSize:17.0f];
UIFontDescriptor *fontDescriptor = font.fontDescriptor;
UIFontDescriptorSymbolicTraits fontDescriptorSymbolicTraits = fontDescriptor.symbolicTraits;
BOOL isBold = (fontDescriptorSymbolicTraits & UIFontDescriptorTraitBold) != 0;
从现在开始,这可能是询问字体特征最简单的方式。
如果您想使用 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..")
}
仅查看字体名称并不总是起作用。考虑字体“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);
CTFontCreateCopyWithSymbolicTraits
函数。 - omzisItalic
无法与 Superclarendon、Marion 和 Gill Sans 字体一起使用。 - Shmidt根据Arjan的回答,针对Swift 3/4的答案是:
extension UIFont {
var isBold: Bool {
return fontDescriptor.symbolicTraits.contains(.traitBold)
}
var isItalic: Bool {
return fontDescriptor.symbolicTraits.contains(.traitItalic)
}
}
uint32_t
强制转换为BOOL
,否则会引起问题。相反,请使用BOOL isBold = (fontDescriptorSymbolicTraits & UIFontDescriptorTraitBold) != 0
或BOOL isBold = !!(fontDescriptorSymbolicTraits & UIFontDescriptorTraitBold)
。 - Jeffery Thomas