1

我试图弄清楚如何使用在 Interface Builder 中定义的字体来最好地加粗和取消加粗 UILabel。

我知道我可以做到这一点,例如:

[myLabel setFont:[UIFont boldSystemFontOfSize:14.0]];

但是后来我强制字体可能不同于它在 IB 中的设计方式(无论是在风格上还是在大小上)。

我正在寻找本质上可以做到这一点的东西:

[myLabel setBold:TRUE];

或 False,视情况而定。

有没有办法做到这一点?

4

4 回答 4

2

不幸的是,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:返回任何值。我注意到使用系统字体,它返回一个空数组。

于 2013-09-25T18:00:52.450 回答
0

例如,如果您使用的是 Helvetica 系统字体,您可以将 label.text 设置为粗体,如下所示:

myLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:14];

例如,您可以在此站点中找到 iOS 字体:link

于 2013-09-25T17:45:04.630 回答
0

您想要一种不管标签中的字体如何都有效的方法,因此它适用于多个标签?

这个怎么样?

使用它的字体属性从标签中获取当前字体。

获取该字体的字体系列名称。

使用 UI fontNamesForFamilyName 向字体系列询问其字体列表。

看看您是否可以在您返回的字体列表中找到粗体字体。如果是这样,请以您当前的字体大小请求该字体。如果不是,请使用当前大小的粗体系统字体。(您可能必须对字体名称进行字符串解析,以查找名称中的“粗体”一词。呃。)

不理想,但你应该能够让它工作。

于 2013-09-25T17:54:34.757 回答
0

我能够找到好的和清晰的解决方案:

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)// 返回相同的字体(名称和大小),但是是粗体和斜体。

于 2020-06-04T09:26:57.427 回答