在iOS上检测字体是否为粗体/斜体?
给定UIFont或CTFont,如何判断字体是否为粗体/斜体?查看字体名称并不总是有效。考虑字体“信使斜”(即斜体)或“HoeFreTeBlack”(粗体),它们中没有包含“粗体”或“斜体”的名称。 将字体指定为在iOS上检测字体是否为粗体/斜体?,ios,uifont,Ios,Uifont,给定UIFont或CTFont,如何判断字体是否为粗体/斜体?查看字体名称并不总是有效。考虑字体“信使斜”(即斜体)或“HoeFreTeBlack”(粗体),它们中没有包含“粗体”或“斜体”的名称。 将字体指定为CTFontRef,确定其粗体还是斜体的正确方法是使用CTFontGetSymbolicTraits功能: CTFontRef font = CTFontCreateWithName((CFStringRef)@"Courier Oblique", 10, NULL); CTFontSy
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);
iOS7字体描述符
没有理由使用核心文本,只需向UIFont请求fontDescriptor即可
UIFont *font = [UIFont boldSystemFontOfSize:17.0f];
UIFontDescriptor *fontDescriptor = font.fontDescriptor;
UIFontDescriptorSymbolicTraits fontDescriptorSymbolicTraits = fontDescriptor.symbolicTraits;
BOOL isBold = (fontDescriptorSymbolicTraits & UIFontDescriptorTraitBold) != 0;
展望未来,这可能是询问字体特征的最简单方法。如果您想使用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..")
}
根据Arjan的回答回答Swift 3/4的问题:
extension UIFont {
var isBold: Bool {
return fontDescriptor.symbolicTraits.contains(.traitBold)
}
var isItalic: Bool {
return fontDescriptor.symbolicTraits.contains(.traitItalic)
}
}
谢谢,我认为这是一种非常干净的方法。还有一个问题。假设我有一个CTFont,如何将其加粗?请使用
CTFontCreateCopyWithSymbolicTraits
功能。isItalic
不适用于SuperLarendon、Marion和Gill Sans字体。不要将uint32\u t
转换为BOOL
,这会给您带来问题。使用BOOL isBold=(fontDescriptorSymbolicTraits&UIFontDescriptorTraitBold)!=0
或BOOL isBold=!!(fontDescriptorSymbolicTraits&UIFontDescriptorTraitBold)
。@JanGreve请重新考虑您的否决票,在有新解决方案可用时回答旧问题是一件好事,为了清晰起见,我添加了Swift标记。我再次删除了Swift标记。作者不可能要求swift,因此您的编辑显然与作者的意图相冲突。除此之外,你是对的;一种新的objective-c技术就可以了。注意:目前正在@Jan