【问题标题】:UILabel get the displayed font size when adjustsFontSizeToFitWidth is YESUILabel 获取 adjustsFontSizeToFitWidth 为 YES 时显示的字体大小
【发布时间】:2016-01-04 13:05:45
【问题描述】:

我有一个UILabel,其中adjustsFontSizeToFitWidth 设置为YES,当文本太大而无法以font 属性的大小绘制时,正如预期的那样,它会缩小屏幕上显示的字体。

我已经询问了font 属性,但这与最初在标签上设置时的状态相同,并且UILabel 似乎没有任何其他可用的属性。

有没有办法找出标签绘制的缩小文本的大小是多少?

编辑:不是建议的重复,因为sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: 在 iOS7 中已被弃用

【问题讨论】:

标签: ios uikit uilabel


【解决方案1】:

事实证明它有点复杂,因为 iOS 7 弃用了有用的 sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:,就像在 suggested duplicate 中使用的那样。

我们现在必须改用NSAttributedString

从标签上设置的 / 字符串创建一个NSAttributedString。将整个属性字符串的字体设置为标签的字体。

NSDictionary *attributes = @{NSFontAttributeName : self.label.font};
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:text
                                                                       attributes:attributes];

然后,创建一个NSStringDrawingContext 对象,配置为使用标签的最小比例因子。这将用于帮助计算实际字体大小。

NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
context.minimumScaleFactor = self.label.minimumScaleFactor;

然后我们可以使用NSAttributedString的方法来计算边界矩形,并进一步配置NSStringDrawingContext

[attributedString boundingRectWithSize:self.label.bounds.size
                               options:NSStringDrawingUsesLineFragmentOrigin
                               context:context];

这将使绘图通过并且上下文将被更新以包含用于在可用空间中绘制文本的比例因子(标签的大小)。

获取实际字体大小就这么简单:

CGFloat actualFontSize = self.label.font.pointSize * context.actualScaleFactor;

【讨论】:

  • 我已将您的答案翻译成 Swift,以便在我的项目中使用。当我使用 boundingRectWithSize 获得 CGRect 时,我可以看到当文本较长时它确实是一个更宽的 CGRect。我没有看到上下文变化的价值。我在这里问过这个问题(使用 Swift 代码):stackoverflow.com/questions/34622503/…
【解决方案2】:

我已经在 link 中为与您的问题类似的 Swift 5 回答了您的问题

然而,我们可以得到actualFontSize如下: 对于单行UILabel

extension UILabel {

     var actualFontSize: CGFloat {
    //initial label
     let fullSizeLabel = UILabel()
     fullSizeLabel.font = self.font
     fullSizeLabel.text = self.text
     fullSizeLabel.sizeToFit()

     var actualFontSize: CGFloat = self.font.pointSize * (self.bounds.size.width / fullSizeLabel.bounds.size.width);

    //correct, if new font size bigger than initial
actualFontSize = actualFontSize < self.font.pointSize ? actualFontSize : self.font.pointSize;

     return actualFontSize
    }

}

获取实际字体大小就这么简单:

let currentLabelFontSize = myLabel.actualFontSize

【讨论】:

    猜你喜欢
    • 2013-10-12
    • 2011-01-24
    • 2017-05-31
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    相关资源
    最近更新 更多