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

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

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

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

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

【问题讨论】:

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

标签: ios objective-c fonts uifont


【解决方案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 的较新答案:herehere


      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
        • 我在此处添加此内容仅供参考:使用自定义字体和不同变体(常规、粗体等)的 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;
            猜你喜欢
            • 2016-01-17
            • 2016-01-16
            • 1970-01-01
            • 2016-02-01
            • 2015-04-01
            • 2013-07-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多