【发布时间】:2011-10-02 01:40:26
【问题描述】:
给定 UIFont 或 CTFont,我如何判断字体是粗体/斜体?
【问题讨论】:
给定 UIFont 或 CTFont,我如何判断字体是粗体/斜体?
【问题讨论】:
查看字体名称并不总是有效。考虑字体“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函数。
isItalic 不适用于 Superclarendon、Marion 和 Gill Sans 字体。
没有理由使用 Core Text,你可以简单地向 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) != 0 或BOOL isBold = !!(fontDescriptorSymbolicTraits & UIFontDescriptorTraitBold)。
如果你想用 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..")
}
【讨论】:
Swift 3/4 的答案基于 Arjan 的回答:
extension UIFont {
var isBold: Bool {
return fontDescriptor.symbolicTraits.contains(.traitBold)
}
var isItalic: Bool {
return fontDescriptor.symbolicTraits.contains(.traitItalic)
}
}
【讨论】: