检测iOS上的字体是粗体还是斜体?

ary*_*axt 19 uifont ios

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

Cam*_*mer 44

iOS7字体描述符

没有理由使用Core Text,你可以简单地向UIFont询问fontDescriptor.

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

展望未来,这可能是询问字体特征的最简单方法.


omz*_*omz 35

查看字体的名称并不总是有效.考虑字体"Courier Oblique"(斜体)或"HoeflerText-Black"(粗体),它们的名称中都不包含"粗体"或"斜体".

给定一个字体作为a 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);
Run Code Online (Sandbox Code Playgroud)


Arj*_*jan 34

如果你想用Swift 2.0做到这一点:

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

    var isItalic: Bool {
        return fontDescriptor().symbolicTraits.contains(.TraitItalic)
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

let font: UIFont = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)
if font.isBold {
  print("it's bold..")
}
Run Code Online (Sandbox Code Playgroud)

  • @JanGreve请重新考虑你的downvote,当有新的解决方案是好事时回答旧问题,为了清楚起见,我添加了Swift标签. (12认同)
  • 我再次删除了swift标签.作者没有办法要求快速,所以你的编辑显然与作者的意图相冲突.除此之外,你是对的; 一个新的Objective-c技术本来没问题. (4认同)
  • 注意:目前正在[讨论meta](http://meta.stackoverflow.com/questions/317716/are-only-tags-allowed-that-the-author-could-have-intended)@Jan (3认同)

Joh*_*ers 5

回答斯威夫特3/4基于阿尔扬的回答:

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

    var isItalic: Bool {
        return fontDescriptor.symbolicTraits.contains(.traitItalic)
    }
}
Run Code Online (Sandbox Code Playgroud)