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

在iOS上检测字体是否为粗体/斜体?,ios,uifont,Ios,Uifont,给定UIFont或CTFont,如何判断字体是否为粗体/斜体?查看字体名称并不总是有效。考虑字体“信使斜”(即斜体)或“HoeFreTeBlack”(粗体),它们中没有包含“粗体”或“斜体”的名称。 将字体指定为CTFontRef,确定其粗体还是斜体的正确方法是使用CTFontGetSymbolicTraits功能: CTFontRef font = CTFontCreateWithName((CFStringRef)@"Courier Oblique", 10, NULL); CTFontSy

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

查看字体名称并不总是有效。考虑字体“信使斜”(即斜体)或“HoeFreTeBlack”(粗体),它们中没有包含“粗体”或“斜体”的名称。

将字体指定为
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