获取最小字体大小后的UILabel字体大小

7

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

有什么办法可以在系统调整字体大小后获取真实的字体大小吗?


不是直接获取,但可以计算。请参见此处的第一个答案:https://dev59.com/O3A65IYBdhLWcg3wuRF8 - savner
很烦人,因为UILabel确实有一个名为_scaledMetrics的私有属性,它是_UILabelScaledMetrics的实例。该类具有_actualScaleFactor属性。但这都是学术性的,因为它不是公开可用的。 - ChrisH
3个回答

4

我不知道有没有API可以获取UILabel缩放内容时的当前字体大小。您可以尝试使用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在评论中指出的那样,这是一个重复的问题。最干净的解决方案在这里找到:如何获得UILabel(UITextView)自动调整字体大小?。然而,Sanjit的解决方案也有效!谢谢大家!

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

1
有人能把这个解决方案翻译成Swift吗? - Narwhal
@Narwhal 我的解决方案是在Objective-C中创建一个子类或类别,并在Swift中使用它。虽然这种方法已经被弃用,但目前没有其他替代方法来获取实际字体大小。 - Adam

1

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

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