我试图弄清楚如何使用在 Interface Builder 中定义的字体来最好地加粗和取消加粗 UILabel。
我知道我可以做到这一点,例如:
[myLabel setFont:[UIFont boldSystemFontOfSize:14.0]];
但是后来我强制字体可能不同于它在 IB 中的设计方式(无论是在风格上还是在大小上)。
我正在寻找本质上可以做到这一点的东西:
[myLabel setBold:TRUE];
或 False,视情况而定。
有没有办法做到这一点?
不幸的是,UIKit 中没有真正的“粗体”概念。如果您曾经尝试将属性字符串的一部分设置为“Bold”,那么您实际上是在选择同一字体系列中的粗体字体变体。
你可以像这样半hackish:
@implementation UIFont (BoldVariant)
- (UIFont *)boldVariant
{
for (NSString *fontName in [UIFont fontNamesForFamilyName:self.familyName]) {
if ([fontName hasSuffix:@"-Bold"]) {
return [UIFont fontWithName:fontName size:self.pointSize];
}
}
// If we couldn't find it, return the same font.
return self;
}
@end
这假定字体遵循标准命名方案。它还假定fontNamesForFamilyName:返回任何值。我注意到使用系统字体,它返回一个空数组。
例如,如果您使用的是 Helvetica 系统字体,您可以将 label.text 设置为粗体,如下所示:
myLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:14];
例如,您可以在此站点中找到 iOS 字体:link
您想要一种不管标签中的字体如何都有效的方法,因此它适用于多个标签?
这个怎么样?
使用它的字体属性从标签中获取当前字体。
获取该字体的字体系列名称。
使用 UI fontNamesForFamilyName 向字体系列询问其字体列表。
看看您是否可以在您返回的字体列表中找到粗体字体。如果是这样,请以您当前的字体大小请求该字体。如果不是,请使用当前大小的粗体系统字体。(您可能必须对字体名称进行字符串解析,以查找名称中的“粗体”一词。呃。)
不理想,但你应该能够让它工作。
我能够找到好的和清晰的解决方案:
extension UIFont {
/// Returns same font but with specific `symbolicTraits`.
func with(symbolicTraits: UIFontDescriptor.SymbolicTraits) -> UIFont {
let descriptor = fontDescriptor.withSymbolicTraits(symbolicTraits) ?? fontDescriptor
return UIFont(descriptor: descriptor, size: pointSize)
}
}
用法:
label.font = label.font.with(symbolicTraits: .traitBold)
或者,如果您想混合多个特征:
label.font = label.font.with(symbolicTraits: [.traitBold, .traitItalic)// 返回相同的字体(名称和大小),但是是粗体和斜体。