【问题标题】:Detect whether a font is bold/italic on iOS?检测iOS上的字体是否为粗体/斜体?
【发布时间】:2011-10-02 01:40:26
【问题描述】:

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

【问题讨论】:

    标签: ios uifont


    【解决方案1】:

    查看字体名称并不总是有效。考虑字体“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);
    

    【讨论】:

    • 谢谢,我认为这是一种非常干净的方式。还有一个问题。假设我有一个 CTFont,如何使它变粗?
    • 使用CTFontCreateCopyWithSymbolicTraits函数。
    • isItalic 不适用于 Superclarendon、Marion 和 Gill Sans 字体。
    【解决方案2】:

    iOS7 字体描述符

    没有理由使用 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)。
    【解决方案3】:

    如果你想用 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..")
    }
    

    【讨论】:

    • @JanGreve 请重新考虑您的否决票,当有新的解决方案可用时回答旧问题是一件好事,为了清楚起见,我添加了 Swift 标签。
    • 我再次删除了 swift 标签。作者不可能要求迅速,因此您的编辑显然与作者的意图相冲突。除此之外,你是对的;一种新的objective-c技术会很好。
    • 注意:目前是discussed on meta@Jan
    【解决方案4】:

    Swift 3/4 的答案基于 Arjan 的回答:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-07
      • 2013-05-17
      • 2011-07-18
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      相关资源
      最近更新 更多