【问题标题】:Get UILabel font pointsize after minimumFontSize在 minimumFontSize 之后获取 UILabel 字体点大小
【发布时间】:2013-06-04 15:44:17
【问题描述】:

我有一个字体大小为 17 的 UILabel。如果我调用 label.font.pointSize 我得到 17,这很好。 BBUUUUTTT 我也将最小字体大小设置为 8,现在如果我在标签中填入一些导致点大小缩小的文本,然后调用 label.font.pointsize 我仍然得到 17,即使我知道点大小更小

任何想法如何在系统调整字体大小后获得真实的点大小?

【问题讨论】:

  • 不是直接计算,但可以计算。在这里查看第一个答案:stackoverflow.com/questions/3669844/…
  • 这很烦人,因为UILabel 确实在名为_scaledMetrics 的私​​有属性中有信息,这是_UILabelScaledMetrics 的一个实例。该类具有_actualScaleFactor 属性。但是所有学术性的,因为它不公开。

标签: ios objective-c cocoa-touch uilabel


【解决方案1】:

我不知道在缩小内容时获取 UILabel 当前点大小的 API。您可以尝试使用sizeWithFont API 来近似“缩放因子”。

只是一个想法:

// Get the size of the text with no scaling (one line)
CGSize sizeOneLine = [label.text sizeWithFont:label.font];

// Get the size of the text enforcing the scaling based on label width
CGSize sizeOneLineConstrained = [label.text sizeWithFont:label.font constrainedToSize:label.frame.size];

// Approximate scaling factor
CGFloat approxScaleFactor = sizeOneLineConstrained.width / sizeOneLine.width;

// Approximate new point size
CGFloat approxScaledPointSize = approxScaleFactor * label.font.pointSize;

【讨论】:

    【解决方案2】:

    正如 savner 在 cmets 中指出的那样,这是一个重复问题。在这里可以找到最干净的解决方案:How to get UILabel (UITextView) auto adjusted font size?。但是,Sanjit 的解决方案也有效!谢谢大家!

    CGFloat actualFontSize;
    [label.text sizeWithFont:label.font
             minFontSize:label.minimumFontSize
          actualFontSize:&actualFontSize
                forWidth:label.bounds.size.width
           lineBreakMode:label.lineBreakMode];
    

    【讨论】:

    • 谁能把这个解决方案翻译成 Swift?
    • @Narwhal 我对 Swift 的解决方案是在 Objective-C 中创建一个子类或类别并在 Swift 中使用它。不推荐,因为该方法已被弃用,但没有其他方法可以获取实际字体大小。
    【解决方案3】:

    Swift 4iOS 7+ 版本(sizeWithFont 现已弃用)@Sanjit Saluja 的回答:

    // Get the size of the text with no scaling (one line)
    let sizeOneLine: CGSize = label.text!.size(withAttributes: [NSAttributedStringKey.font: label.font])
    
    // Get the size of the text enforcing the scaling based on label width
    let sizeOneLineConstrained: CGSize = label.text!.boundingRect(with: label.frame.size, options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: label.font], context: nil).size
    
    // Approximate scaling factor
    let approxScaleFactor: CGFloat = sizeOneLineConstrained.width / sizeOneLine.width
    
    // Approximate new point size
    let approxScaledPointSize: CGFloat = approxScaleFactor * label.font.pointSize
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-15
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多