36

如果我有一个UIFont对象,是否可以将其转换为粗体?我不知道字体名称,我只有一个 UIFont 对象。我想要的是一个类似的功能

UIFont *boldFontFromFont(UIFont *input)
{
    return [input derivedFontWithFontWeight:UIFontWeightBold];
}

如何更改代码以使其正常工作。(上面的代码不起作用,我只是为了说明这一点而编造的。)

提前致谢。

4

8 回答 8

97

iOS 7 引入了一个新的UIFontDescriptor类,这使它变得更容易:

UIFont *font = [UIFont fontWithName:@"Helvetica Neue" size:12];
NSLog(@"plain font: %@", font.fontName); // “HelveticaNeue”

UIFont *boldFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold] size:font.pointSize];
NSLog(@"bold version: %@", boldFont.fontName); // “HelveticaNeue-Bold”

UIFont *italicFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic] size:font.pointSize];
NSLog(@"italic version: %@", italicFont.fontName); // “HelveticaNeue-Italic”

UIFont *boldItalicFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold | UIFontDescriptorTraitItalic] size:font.pointSize];
NSLog(@"bold & italic version: %@", boldItalicFont.fontName); // “HelveticaNeue-BoldItalic”

对于来这里寻找 Cocoa (macOS) 等价物的人来说,UIFontDescriptor来自NSFontDescriptor,自 10.3 起可用。

于 2014-01-26T16:44:40.080 回答
27

如果您正在寻找快速实施

let normalFont = UIFont(name: "FONT_NAME", size: CGFloat(20))!
let boldFont = UIFont(descriptor: normalFont.fontDescriptor.withSymbolicTraits(.traitBold)!, size: normalFont.pointSize)

希望这可以帮助!干杯!

于 2014-11-20T04:59:59.357 回答
14

要获得粗体字体,您需要从字体系列中传递特定的字体名称。您可以从给定字体中获取字体系列名称,然后列出该系列中的所有字体。通常,粗体字体的名称中会包含“粗体”,但格式并不严格,并且可能存在诸如“Helvetica-BoldOblique”之类的变体。您可以从以下代码开始:

- (UIFont *)boldFontFromFont:(UIFont *)font
{
    NSString *familyName = [font familyName];
    NSArray *fontNames = [UIFont fontNamesForFamilyName:familyName];
    for (NSString *fontName in fontNames)
    {
        if ([fontName rangeOfString:@"bold" options:NSCaseInsensitiveSearch].location != NSNotFound)
        {
            UIFont *boldFont = [UIFont fontWithName:fontName size:font.pointSize];
            return boldFont;
        }
    }
    return nil;
}
于 2013-04-15T13:23:45.440 回答
8

这是一个非常古老的线程,但现在有人可能对如何在 Swift 5 中执行此操作感兴趣。

像这样简单:

var font: UIFont = UIFont.systemFont(ofSize: 18)
if let newDescriptor = font.fontDescriptor.withSymbolicTraits(.traitBold) {
    font = UIFont(descriptor: newDescriptor, size: font.pointSize)
}
于 2019-04-19T00:46:23.423 回答
7

由于系统字体的神秘字体系列名称,尝试使用字体或系列名称派生粗体/斜体字体自 iOS 7 以来不再正常工作。下面是一个使用 UIFontDescriptor 类派生粗体/斜体字体的简单扩展。

+(UIFont *) font:(UIFont *)font bold:(BOOL)bold italic:(BOOL)italic
{
    NSUInteger traits = 0;
    if (bold)
    {
        traits |= UIFontDescriptorTraitBold;
    }
    if (italic)
    {
        traits |= UIFontDescriptorTraitItalic;
    }
    return [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:traits] size:font.pointSize];
}
于 2014-02-10T06:45:47.787 回答
2

您可以使用

[UIFont boldSystemFontOfSize:12].

如果您使用自定义字体,则必须直接使用名称

[UIFont fontWithName:@"Helvetica-Bold" size:17.0].

您可以查找可能的字体名称

[UIFont fontNamesForFamilyName:@"American Typewriter"].

在这篇文章中:https ://stackoverflow.com/a/15388946/436818 Ben M 知道如何动态获取粗体版本。但是扩展该方法以确保获得粗体版本(如果存在),因为还有其他粗体版本,例如 CondensedBold。

于 2013-04-15T13:25:15.867 回答
2

由于在Swift中搜索粗体 UIFonts 时会弹出此问题,因此这里有一个新答案:

extension UIFont {
    /// Returns a new font in the same family with the given symbolic traits,
    /// or `nil` if none found in the system.
    func withSymbolicTraits(_ traits: UIFontDescriptor.SymbolicTraits) -> UIFont? {
        guard let descriptorWithTraits = fontDescriptor.withSymbolicTraits(traits)
            else { return nil }
        return UIFont(descriptor: descriptorWithTraits, size: 0)
    }
}

例子:

myFont.withSymbolicTraits(.taitBold) // returns the bold version of myFont
于 2019-02-23T18:17:26.473 回答
0

没有人发布解决方案:

  • 适用于斯威夫特
  • 是一个扩展UIFont
  • 不强制展开
  • 使用与源字体相同的磅值
  • UIFont并且只做问题中提出的问题(根据现有创建粗体UIFont

所以我正在这样做:

import UIKit

extension UIFont {
    func boldFont() -> UIFont? {
        guard let boldDescriptor = fontDescriptor.withSymbolicTraits(.traitBold) else {
            return nil
        }

        return UIFont(descriptor: boldDescriptor, size: pointSize)
    }
}

随意复制粘贴!

于 2021-11-01T15:02:15.577 回答