我有一个UILabel
,adjustsFontSizeToFitWidth
设置为YES
,并且按预期的方式,当文本太大而无法以font
属性的大小绘制时,它将缩小屏幕上显示的字体。
我已经审问过font
属性,但这与最初在标签上设置时的属性相同,并且UILabel
似乎没有其他可用的属性。
是否有办法找出由标签绘制的缩小文本的大小?
编辑:由于iOS7中不推荐使用sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:
,因此不建议重复
事实证明,由于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];
我已经在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
}
}