5

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

到目前为止,我发现的所有内容都是您必须设置正确的字体名称。然而,这是不可靠的。Cochinis的粗体版本Cochin-Bold,但ArialMTis not ArialMT-Boldbut的粗体版本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可以在这里提供帮助?

4

3 回答 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];

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

于 2011-12-16T12:41:47.907 回答
1

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

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

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

于 2017-03-06T11:38:16.330 回答
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)
    }
}
于 2017-09-10T22:37:23.260 回答