如何制作UIFont粗体或斜体?

时间:2011-12-16 10:27:57

标签: iphone ios

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

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

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

__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 个答案:

答案 0 :(得分: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];

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

答案 1 :(得分: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)
    }
}

答案 2 :(得分:0)

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

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

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