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可以在这里提供帮助吗?
答案 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。