UILabel在adjustsFontSizeToFitWidth为YES时获取显示的字体大小

问题描述 投票:5回答:2

我有一个UILabeladjustsFontSizeToFitWidth设置为YES,并且按预期的方式,当文本太大而无法以font属性的大小绘制时,它将缩小屏幕上显示的字体。

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

是否有办法找出由标签绘制的缩小文本的大小?

编辑:由于iOS7中不推荐使用sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:,因此不建议重复

ios uikit uilabel
2个回答
12
投票

事实证明,由于iOS 7弃用了sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:中使用的有用的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];

0
投票

我已经在CGFloat actualFontSize = self.label.font.pointSize * context.actualScaleFactor; 中回答了与您的问题类似的Swift 5的问题

但是,我们可以按如下方式获取实际字体大小:对于单行UILabel

link

然后获得实际的字体大小就这么简单:

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
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.