如何在iPhone/iPad的UILabel上设置粗体和斜体?

154

我该如何在iPhone/iPad的UILabel上设置加粗和斜体?我在论坛上搜索过,但没有帮助到我。有人能帮帮我吗?


如果您正在使用自定义字体但无法设置为斜体,可以尝试此方法。 - Jakehao
请检查我的答案 https://dev59.com/DLfna4cB1Zd3GeqPkwEJ#66885655 - Gurjit Singh
19个回答

322

不要试图玩弄字体名称。使用字体描述符,您无需名称:

UILabel * label = [[UILabel alloc] init]; // use your label object instead of this
UIFontDescriptor * fontD = [label.font.fontDescriptor
            fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold
                            | UIFontDescriptorTraitItalic];
label.font = [UIFont fontWithDescriptor:fontD size:0];

size:0 表示“保持原有大小”

使用 Swift 尝试以下扩展:

extension UIFont {

    func withTraits(traits:UIFontDescriptorSymbolicTraits...) -> UIFont {
        let descriptor = self.fontDescriptor()
            .fontDescriptorWithSymbolicTraits(UIFontDescriptorSymbolicTraits(traits))
        return UIFont(descriptor: descriptor, size: 0)
    }

    func boldItalic() -> UIFont {
        return withTraits(.TraitBold, .TraitItalic)
    }

}

那么您可以这样使用它:

myLabel.font = myLabel.font.boldItalic()

甚至可以添加额外的特性,如紧凑:

myLabel.font = myLabel.font.withTraits(.TraitCondensed, .TraitBold, .TraitItalic)

Swift 4 更新:

extension UIFont {
  var bold: UIFont {
    return with(traits: .traitBold)
  } // bold

  var italic: UIFont {
    return with(traits: .traitItalic)
  } // italic

  var boldItalic: UIFont {
    return with(traits: [.traitBold, .traitItalic])
  } // boldItalic


  func with(traits: UIFontDescriptorSymbolicTraits) -> UIFont {
    guard let descriptor = self.fontDescriptor.withSymbolicTraits(traits) else {
      return self
    } // guard

    return UIFont(descriptor: descriptor, size: 0)
  } // with(traits:)
} // extension

使用方法如下:

myLabel.font = myLabel.font.bold

或者

myLabel.font = myLabel.font.italic

或者

myLabel.font = myLabel.font.with(traits: [.traitBold, .traitCondensed])

更新 Swift 5 版本

extension UIFont {
    var bold: UIFont {
        return with(.traitBold)
    }

    var italic: UIFont {
        return with(.traitItalic)
    }

    var boldItalic: UIFont {
        return with([.traitBold, .traitItalic])
    }



    func with(_ traits: UIFontDescriptor.SymbolicTraits...) -> UIFont {
        guard let descriptor = self.fontDescriptor.withSymbolicTraits(UIFontDescriptor.SymbolicTraits(traits).union(self.fontDescriptor.symbolicTraits)) else {
            return self
        }
        return UIFont(descriptor: descriptor, size: 0)
    }

    func without(_ traits: UIFontDescriptor.SymbolicTraits...) -> UIFont {
        guard let descriptor = self.fontDescriptor.withSymbolicTraits(self.fontDescriptor.symbolicTraits.subtracting(UIFontDescriptor.SymbolicTraits(traits))) else {
            return self
        }
        return UIFont(descriptor: descriptor, size: 0)
    }
}

8
不知道为什么这个没有得到更多的投票!对于那些没有加粗或斜体样式的字体来说,这个工具很棒! - Chris Prince
4
啊,我明白为什么这款应用可能不太受欢迎了。它只能在 iOS7 及以上版本中使用…… - Chris Prince
3
不确定这是否应该在NDA范围内考虑,但使用Xcode6和iOS8 GM seed时,对于自定义字体,我会得到一个空的字体描述符(font descriptor),而在iOS7下它不是空的。 - Chris Prince
2
只是一个快速的提示,因为这个答案非常有帮助:return withTraits(.TraitBold, .TraitCondensed) 可能应该改为 return withTraits(.TraitBold, .TraitItalic) 以匹配函数名称。 - BreadicalMD
1
这是否使用自定义字体工作?我得到了空描述符。 - Pepeng Hapon
显示剩余5条评论

133
sectionLabel.font = [UIFont fontWithName:@"TrebuchetMS-Bold" size:18];

你可以在'fontWithName'属性的位置上设置字体名称列表。链接在这里


5
更好的答案是使用 @Maksymilian Wojakowski 提供的扩展方法 .withTraits()。 - No Refunds No Returns
先生,如何在不声明大小的情况下设置 Objective-C 文本框样式为粗体? - Ramani Hitesh
3
由于您使用了固定的字体名称,这是有问题的。由于这可能会发生变化,因此这不是一个好的解决方案。Maksymilian Wojakowski的答案更好,而且更加灵活。 - Ray Wojciechowski
也许提问者使用了自定义字体,所以Maksymilian Wojakowski的答案不会“影响标签”。我尝试使用Maksymilian Wojakowski,但由于我使用了自定义字体,它无法正常工作。 - Farras Doko

104

@Edinator看一下这个...

myLabel.font = [UIFont boldSystemFontOfSize:16.0f]
myLabel.font = [UIFont italicSystemFontOfSize:16.0f];

你可以在需要的时候使用上述任何一种。


2
两种样式都不起作用。在这种情况下,后者斜体样式占优势。谢谢回复! - Edi
@Edinator 是的,我知道你只能同时使用一个...我也编辑了我的答案! - Sudhanshu

8

Swift 3

加粗:

let bondFont = UIFont.boldSystemFont(ofSize:UIFont.labelFontSize)

斜体:

let italicFont = UIFont.italicSystemFont(ofSize:UIFont.labelFontSize)


8

您可以在字体字段中点击字母"T",为标签设置任何字体样式、家族和大小。

标签字体设置


但是这里有一个重要的问题,除了使用fontWithName:@"Arial-Light"之外,你如何指定截图中的其他字重?一切都会带来boldSystemFontSize(of:__),但如果有人想要轻或超轻呢? - Dave G

7

如果想使用iOS 7系统默认字体,您需要使用Helvetica Neue Bold。

    [titleText setFont:[UIFont fontWithName:@"HelveticaNeue-Bold" size:16.0]];

或者你可以简单地称之为:
    [titleText setFont:[UIFont boldSystemFontOfSize:16.0]];

6

我也遇到了同样的问题,需要在标签和按钮上同时应用加粗和斜体。您可以使用以下代码来实现此效果:

myLabel.font = [UIFont fontWithName:@"Arial-BoldItalic" size:30.0];

1
我想你的意思是“Arial”,而不是“Ariel” :) - MMMM
对于Arial字体不起作用,但是Helvetica-BoldOblique可以。请参阅此处的UIFont文档:http://iphonedevwiki.net/index.php/UIFont - sudip
1
你是指"HelveticaNeue",而非"Arial" :) - jpmartineau
如果我们添加自定义字体会怎样呢? - Majid Bashir

4

我修改了Maksymilian Wojakowski的响应变量,使你可以添加或删除一个或多个特征。

extension UIFont {

    func withTraits(_ traits:UIFontDescriptorSymbolicTraits...) -> UIFont {
        let descriptor = self.fontDescriptor
            .withSymbolicTraits(UIFontDescriptorSymbolicTraits(traits).union(self.fontDescriptor.symbolicTraits))
        return UIFont(descriptor: descriptor!, size: 0)
    }
    func withoutTraits(_ traits:UIFontDescriptorSymbolicTraits...) -> UIFont {
        let descriptor = self.fontDescriptor
            .withSymbolicTraits(  self.fontDescriptor.symbolicTraits.subtracting(UIFontDescriptorSymbolicTraits(traits)))
        return UIFont(descriptor: descriptor!, size: 0)
    }
    func bold() -> UIFont {
        return withTraits( .traitBold)
    }

    func italic() -> UIFont {
        return withTraits(.traitItalic)
    }

    func noItalic() -> UIFont {
        return withoutTraits(.traitItalic)
    }
    func noBold() -> UIFont {
        return withoutTraits(.traitBold)
    }
}

示例

label.font = label.font.italic().bold()

当您重用单元格并希望删除先前单元格中标签上的斜体时,它非常有用。


3

示例粗体文本:

UILabel *titleBold = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 200, 30)];
UIFont* myBoldFont = [UIFont boldSystemFontOfSize:[UIFont systemFontSize]];
[titleBold setFont:myBoldFont];

示例斜体文本:

UILabel *subTitleItalic = [[UILabel alloc] initWithFrame:CGRectMake(10, 35, 200, 30)];
UIFont* myItalicFont = [UIFont italicSystemFontOfSize:[UIFont systemFontSize]];
[subTitleItalic setFont:myItalicFont];

3
尽管@tolbard提供的答案非常出色且有效!但我认为为了只需一行代码就能实现的事情而创建扩展会过度杀伤。您可以通过使用UIFontDescriptor在下面的示例中所示的方式设置字体属性,从而为您的label获取加粗和斜体样式,Swift 4.0可用。
label.font = UIFont(descriptor: UIFontDescriptor().withSymbolicTraits([.traitBold, .traitItalic])!, size: 12)

其他选项包括:
traitLooseLeading
traitTightLeading
traitUIOptimized
traitVertical
traitMonoSpace
traitCondensed
traitExpanded

想要了解这些符号特征的更多信息?点击这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接