根据容器宽度手动计算绘制的 NSAttributedString 的字体大小

Manually calculate font size for drawn NSAttributedString based on container width

UILabel 有 属性 adjustsFontSizeToFitWidth 如果边界框小于当前字体大小可以显示的文本,它会计算完美的字体大小。

我正在 UIGraphicsImageRendererContext 上绘制文本,然后将其导出到图像中。我想用我当前使用的 NSAttributedStrings 重新创建 adjustsFontSizeToFitWidth 的行为。这是我用来绘制的代码:

let text = NSAttributedString(string: "Example Text", attributes: [NSAttributedString.Key.font: font.withSize(16)])
text.draw(in: CGRect(x: 100, y: 100, width: 100, height: 20))

有没有办法根据可用宽度计算出完美的字体大小?我假设这将是一种算法?

我通过将较小的容器宽度与建议的字符串宽度相乘来找到比例因子,然后使用该比例因子来确定新的字体大小来实现这一点。

var title = NSAttributedString(string: "Example", attributes: [NSAttributedString.Key.font: font.withSize(fontSize)])

let titleWidth = title.size().width
if titleWidth > containerWidth {
  let scaleFactor = containerWidth / titleWidth
  title = NSAttributedString(string: title.string, attributes: [NSAttributedString.Key.font: font.withSize(fontSize * scaleFactor)])
}
title.draw(in: CGRect(x: 100, y: 100, width: containerWidth, height: containerHeight))