如何将UIFont字体加粗或斜体?

5
拥有任何字体的UILabel,我该如何找出它是否已经是粗体?或者我该如何将其设置为粗体?在CSS中,我有一个font-weight属性。我想要类似的东西。
到目前为止,我发现的所有内容都是你必须设置正确的字体名称。然而,这是不可靠的。Cochin-BoldCochin的粗体版本,但ArialMT-Bold并不是ArialMT的粗体版本,而是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可以帮助解决这个问题?

3个回答

10

也许可以使用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];

我不知道这种方法有多快,但你可以在应用程序启动时执行此操作,然后缓存这些名称。


非常感谢!我刚刚发现了这篇文章,它有一个类似的解决方案。我尝试过使用变体轴,但是文档真的没有很好地记录。 - Björn Landmesser
3
一个小问题:CTFontCopyFullName 返回例如 "American Typewriter Bold",但我想要 "AmericanTypewriter-Bold"。为了得到正确的名称,我需要使用 CFStringRef boldName = CTFontCopyName(boldFont, kCTFontPostScriptNameKey) - Björn Landmesser
2
虽然有些晚了,但你也可以使用函数CTFontCopyPostScriptName获取PostScript名称。这个答案应该进行更正,因为原帖中的方法不起作用。 - warrenm
感谢您的编辑!自从我发布了这个答案以来,UIFontDescriptor被引入,这使得这个过程变得更加容易。我会发布一个新的答案。 - Amy Worrall

1

iOS 7引入了UIFontDescriptor工具,可用于此操作。

要查找字体是否已加粗,请获取您的字体的UIFontDescriptor(通过UIFont的fontDescriptor属性),然后调用symbolicTraits,并检查UIFontDescriptorTraitBold的结果位掩码。

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


1

UIFontDescriptorSymbolicTraits符号描述了字体的风格特点。高16位用于描述字体的外观,而低16位用于描述字体类型。由高16位表示的字体外观信息可以用于风格字体匹配。

Swift 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)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接