在 iOS UILabel 上设置 BOLD 字体

Posted

技术标签:

【中文标题】在 iOS UILabel 上设置 BOLD 字体【英文标题】:Setting BOLD font on iOS UILabel 【发布时间】:2013-09-22 15:50:35 【问题描述】:

我已经使用 Interface Builder 为 UILabel 中的文本分配了大小为 14 的自定义字体“Helvetica”。

我在多个地方重复使用相同的标签,但在某些地方我必须以粗体显示文本。

有什么方法可以让现有字体变为粗体,而不是再次创建整个 UIFont?这就是我现在所做的:

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

【问题讨论】:

您是在问有没有办法在不重新制作实际字体文件的情况下使其变为粗体 - 或者您是在问有没有一种方法可以在您将文本设置为该字体时轻松使其变为粗体? 在不重新制作的情况下使其变为粗体。我已经在 IB 中设置了我的字体,但是在标签上绘制文本时,我会将 BOOL 传递给一个方法来判断文本是否为粗体。如果它是粗体,它应该使用 IB 中的字体(无需再次创建)并将其变为粗体。 您是否拖放任何自定义字体文件,如 .TTF 等? I want to make UILabel's text bold的可能重复 如果您没有粗体,请查看此处:***.com/questions/16047901/… 【参考方案1】:

非常老的线程,但没有人展示如何在 Swift 中做到这一点并保持以前的大小

label.font = UIFont.systemFont(ofSize: label.font!.pointSize, weight: .bold)

【讨论】:

【参考方案2】:
let boldHelveticaFont = UIFont(name: "HelveticaNeue", size: 25)?.fontDescriptor.withSymbolicTraits(UIFontDescriptor.SymbolicTraits.traitBold)
label.font = UIFont(descriptor: boldHelveticaFont!, size: 25)

【讨论】:

【参考方案3】:

我为 Swift 4 更新了 UILabel 扩展的贡献:

extension UILabel
    func bold() -> UILabel 
        if let descriptor = self.font.fontDescriptor.withSymbolicTraits(UIFontDescriptor.SymbolicTraits.traitBold)
            self.font = UIFont(descriptor: descriptor, size: 0)
        
        return self
    

像这样调用 .bold() :

let myLabel = UILabel()
myLabel.bold()

【讨论】:

@discardableResult 此用法需要【参考方案4】:

更新:ios 8 开始,不再需要弄乱字体名称。而是查看使用 UIFontDescriptorSymbolicTraits 的较新答案:here 和 here。


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

如果你想以编程方式设置它,你必须检查粗体类型在 iOS 中是否支持,通常粗体或斜体的格式为 FontName-Bold、FontName-Italic、FontName-BoldItalic。

现在,写一个粗体函数

-(void)boldFontForLabel:(UILabel *)label
    UIFont *currentFont = label.font;
    UIFont *newFont = [UIFont fontWithName:[NSString stringWithFormat:@"%@-Bold",currentFont.fontName] size:currentFont.pointSize];
    label.font = newFont;

然后调用它

[self boldFontForLabel:yourLabel];

【讨论】:

感谢飞碟的回复!!但我不想再次创建 UIFont。有没有办法告诉 myLabel.font 为我在 IB 中设置的现有字体设置粗体字重/样式? 您的boldFontForLabel: 方法对于许多字体都会失败。遗憾的是,并非所有粗体字体都只是在末尾添加了-Bold 抱歉,忘记了 currentFont.fontName。再次检查 是的,他必须在使用前检查它是否支持。 @benLIVE 该链接已损坏,这是一个很好的链接,只要我是开发人员就一直存在:iosfonts.com【参考方案5】:

如果您想为任何自定义字体添加“扩展名”,您可能不需要这样的“扩展名”...

只需添加一个函数(类似于上面的一些),您可以从任何地方(即没有类)调用它,然后您可以在许多情况下通过调用 ONE LINE 来加粗任何字符串中的单词代码:

进入像 constants.swift 这样的文件:

import Foundation
import UIKit

func addBoldText(fullString: NSString, boldPartOfString: NSString, font: UIFont!, boldFont: UIFont!) -> NSAttributedString 
   let nonBoldFontAttribute = [NSFontAttributeName:font!]
   let boldFontAttribute = [NSFontAttributeName:boldFont]
   let boldString = NSMutableAttributedString(string: fullString as String, attributes:nonBoldFontAttribute)
   boldString.addAttributes(boldFontAttribute, range: fullString.rangeOfString(boldPartOfString as String))
   return boldString

然后你可以为任何 UILabel 调用这行代码:

self.UILabel.attributedText = addBoldText("Check again in 30 DAYS to find more friends", boldPartOfString: "30 DAYS", font: normalFont!, boldFont: boldSearchFont!)


//Mark: Albeit that you've had to define these somewhere:

let normalFont = UIFont(name: "INSERT FONT NAME", size: 15)
let boldFont = UIFont(name: "INSERT BOLD FONT", size: 15)

【讨论】:

【参考方案6】:

对于“swifters”尝试一下。

此示例控制器将显示 4 个带有所有变体的标签。

import UIKit

class ViewController: UIViewController 


    var labl: UILabel?
    var labl2: UILabel?
    var labl3: UILabel?
    var labl4: UILabel?

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let font = UIFont.systemFontOfSize(32)
        labl = UILabel(frame: CGRectMake(20,20,400, 45))
        labl!.text = "Attention:"
        labl!.font = font

        labl2 = UILabel(frame: CGRectMake(20,60,400, 45))
        labl2!.text = "Attention:"
        labl2!.font = bold(font)

        labl3 = UILabel(frame: CGRectMake(20,100,400, 45))
        labl3!.text = "Attention:"
        labl3!.font = italic(font)

        labl4 = UILabel(frame: CGRectMake(20,140,400, 45))
        labl4!.text = "Attention:"
        labl4!.font = boldAndItalic(font)



        self.view.addSubview(labl!)
        self.view.addSubview(labl2!)
        self.view.addSubview(labl3!)
        self.view.addSubview(labl4!)


    

    // nice to write an extension...
    func bold(font: UIFont) -> UIFont 
        let descriptor = font.fontDescriptor().fontDescriptorWithSymbolicTraits([.TraitBold])
        return UIFont(descriptor: descriptor, size: 0)
    

    func boldAndItalic(font: UIFont) -> UIFont 
        let descriptor = font.fontDescriptor().fontDescriptorWithSymbolicTraits([.TraitBold, .TraitItalic])
        return UIFont(descriptor: descriptor, size: 0)
    

    func italic(font: UIFont) -> UIFont 
        let descriptor = font.fontDescriptor().fontDescriptorWithSymbolicTraits([.TraitItalic])
        return UIFont(descriptor: descriptor, size: 0)
    

为 UIFont 类写一个扩展会很好。

【讨论】:

并不总是有效,尤其是动态字体。不能让它在 9.3.3 上工作了。【参考方案7】:

弄乱字体名称是一件很可疑的事情。据说你有一个斜体字体,你想把它加粗——在名字上简单地添加@"-Bold"是行不通的。还有更优雅的方式:

- (UIFont *)boldFontWithFont:(UIFont *)font

    UIFontDescriptor * fontD = [font.fontDescriptor
                fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold];
    return [UIFont fontWithDescriptor:fontD size:0];

size:0 表示“保持描述符中的大小”。 如果您需要斜体字体,您可能会发现有用的 UIFontDescriptorTraitItalic 特征

在 Swift 中编写一个简单的扩展会很好:

extension UIFont 

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

    func bold() -> UIFont 
        return withTraits(.TraitBold)
    

    func italic() -> UIFont 
        return withTraits(.TraitItalic)
    

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


那么你可以这样使用它:

myLabel.font = myLabel.font.boldItalic()

myLabel.font = myLabel.font.bold()

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

【讨论】:

要恢复正常,请使用:fontDescriptorWithSymbolicTraits:0 注意:仅适用于 iOS 7,per:developer.apple.com/library/ios/documentation/uikit/reference/… 我在此处添加此内容仅供参考:使用自定义字体和不同变体(常规、粗体等)的 fontDescriptorWithSymbolicTraits 性能缓慢,这导致我的一个表格视图出现严重滞后。不过系统字体没有问题。 @ale84 - 听起来你没有缓存答案。编写代码应该很容易,因此它只需要进行一次转换,而不是每个出现的标签一次。 @ToolmakerSteve 是的,缓存可能是解决问题的一种方法。实际上对我来说,最困难的部分是找出导致延迟的原因,因为我没想到会是这样......【参考方案8】:

我用 Swift

做的有点不同
var boldHelveticaFont = UIFont(name: "Helvetica Neue", size: 40)?.fontDescriptor().fontDescriptorWithSymbolicTraits(UIFontDescriptorSymbolicTraits.TraitBold)
self.InstructionsTextView.font = UIFont(descriptor: boldHelveticaFont!, size: 40)

【讨论】:

【参考方案9】:

扩展this答案,迅速:

extension UIFont 
    func bold() -> UIFont 
        let descriptor = self.fontDescriptor().fontDescriptorWithSymbolicTraits(UIFontDescriptorSymbolicTraits.TraitBold)
        return UIFont(descriptor: descriptor, size: 0)
    

【讨论】:

它为 UIFont 添加了一个方法权限。所以在这种情况下,它会像:let boldFont = originalFont.bold() 在这里,getter 属性可能是更好的选择,因为函数可以返回值或执行某些操作。这种歧义可以用一个属性来澄清,这样你就不用输入括号了。【参考方案10】:

我们只需要正确的字体名称。我发现 iOSFonts.com 是准确了解使用什么名称的最有用资源。

您可以使用 FONT NAME "Arial-BoldItalicMT" 设置 Bold + ITALIC

它适用于各种情况:

[myLabel setFont:[UIFont fontWithName:@"Arial-BoldItalicMT" size:17]];

【讨论】:

【参考方案11】:
UIFont* boldFont = [UIFont boldSystemFontOfSize:[UIFont systemFontSize]];
[myLabel setFont:boldFont];

【讨论】:

Swift 3.0: UIFont.systemFont(ofSize: 20, weight: UIFontWeightSemibold) 好答案,+1 ;)。我正在使用 xcode 10.2,这也可以:UIFont *boldFont = [UIFont systemFontOfSize:[UIFont systemFontSize] weight:UIFontWeightHeavy];,如果您想恢复正常:UIFont *normalFont = [UIFont systemFontOfSize:[UIFont systemFontSize] weight:UIFontWeightRegular]; 申请:self.btnSave.titleLabel.font = normalFont;

以上是关于在 iOS UILabel 上设置 BOLD 字体的主要内容,如果未能解决你的问题,请参考以下文章

在IOS8上根据边框大小设置UILabel字体大小?

iOS运用runtime全局修改UILabel的默认字体

iOS @IBDesignable 自动刷新 UILabel 参数为标题、字体、颜色

iOS:以编程方式设置 UILabel 的字体大小

如何在 iOS 中根据 dp(不是点数)设置 UILabel 字体大小,就像只有自动布局的 android

ios设置UILabel中文字的不同颜色和字体字号