【问题标题】:How to make a UIFont bold or italic?如何使 UIFont 粗体或斜体?
【发布时间】:2012-01-21 21:38:17
【问题描述】:

有一个带有任何字体的UILabel,我怎样才能知道它是否已经是粗体?或者我怎样才能让它变得大胆?在 CSS 中,我有一个 font-weight 属性。我想要类似的东西。

到目前为止,我发现的一切都是您必须设置正确的字体名称。然而,这是不可靠的。 Cochin 的粗体版本是Cochin-Bold,但ArialMT 的粗体版本不是ArialMT-Bold 而是Arial-BoldMT,所以显然追加-Bold 是不够的。 (自定义字体的粗体版本也可以有一个完全不同的名称)。

我能做的是找到我给定字体系列的所有字体。

__block UIFont *font = myLabel.font;
[[UIFont fontNamesForFamilyName:font.familyName] enumerateObjectsUsingBlock:^(NSString *fontName, NSUInteger idx, BOOL *stop) {
    if ([fontName rangeOfString:@"bold" options:NSCaseInsensitiveSearch].location != NSNotFound) {
        font = [UIFont fontWithName:fontName size:font.pointSize];
        *stop = YES;
    }
}];
myLabel.font = font;

但这并不可靠。我可以轻松获得BoldItalic 版本。我可以改进我的检查来避免这种情况,但这并不是一个好的解决方案。

也许 CoreText 可以在这里提供帮助?

【问题讨论】:

    标签: ios objective-c iphone uifont


    【解决方案1】:

    UIFontDescriptorSymbolicTraits 象征性地描述了字体的风格方面。高 16 位用于描述字体的外观,而低 16 位用于描述字体。高16位表示的字体外观信息可用于风格字体匹配。

    斯威夫特 3

    extension UIFont {
        convenience init?(name: String, size: CGFloat, symbolicTraits: UIFontDescriptorSymbolicTraits) {
            guard let descriptor = UIFontDescriptor(name: name, size: size).withSymbolicTraits(symbolicTraits) else { return nil }
            self.init(descriptor: descriptor, size: size)
        }
    }
    

    【讨论】:

      【解决方案2】:

      在 iOS 7 中引入,UIFontDescriptor 是执行此操作的工具。

      要确定字体是否已经是粗体,请获取字体的 UIFontDescriptor(通过 UIFont 的 fontDescriptor 属性),然后调用 symbolicTraits,并检查生成的 UIFontDescriptorTraitBold 位掩码。

      同样,要查找粗体版本,获取原始字体的字体描述符,然后调用- fontDescriptorWithSymbolicTraits:。然后,您可以通过调用 + [UIFont fontWithDescriptor:size:] 将其转回 UIFont。

      【讨论】:

        【解决方案3】:

        也许 CoreText 可以在这里提供帮助?

        CoreText 使用自己的字体系统 CTFont。如果你正在使用它,你可以做你想做的事:

        CTFontRef font = CTFontCreateWithName((__bridge CFStringRef)name, size, NULL);
        CTFontRef boldFont = CTFontCreateCopyWithSymbolicTraits(font, 0.0, NULL, kCTFontBoldTrait, kCTFontBoldTrait);
        

        我想你可以得到派生的粗体字体的名称:

        CFStringRef boldName = CTFontCopyPostScriptName(boldFont);
        

        ...并用它来创建一个新的 UIFont:

        UIFont *ret = [UIFont fontWithName:(NSString *)boldName size:size];
        

        我不知道这会有多快,但您可以在应用启动时执行此操作,然后缓存名称。

        【讨论】:

        • 非常感谢!我刚刚发现this article 有类似的解决方案。我尝试使用变体轴,但这确实没有很好地记录。
        • 一件小事:CTFontCopyFullName 产生例如"American Typewriter Bold",但我想要"AmericanTypewriter-Bold"。要获得正确的名称,我必须使用 CFStringRef boldName = CTFontCopyName(boldFont, kCTFontPostScriptNameKey)
        • 这里是迟到的条目,但您也可以使用函数CTFontCopyPostScriptName 获取 PostScript 名称。这应该在答案中更正,因为它不像发布的那样工作。
        • 感谢编辑!自从我发布了这个答案,UIFontDescriptor 就被引入了,这使得这个过程变得更加容易。我会发布一个新的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-11
        • 1970-01-01
        • 2021-12-12
        • 2013-04-07
        • 2011-07-18
        • 1970-01-01
        • 2011-09-26
        相关资源
        最近更新 更多