-2

我已经尝试了在 StackOverflow 上找到的所有内容,但没有任何效果。我需要为任何可用的/随机UIFont计算 boundingRect 的高度。

代码很简单(我修改了一些代码以提高可读性):

let ps = NSMutableParagraphStyle()
ps.lineBreakMode = NSLineBreakMode.byWordWrapping
ps.alignment = NSTextAlignment.center
ps.lineSpacing = 0
ps.paragraphSpacingBefore = 0
ps.paragraphSpacing = 0

let myRandomFont = geMyRandomFont(name: randomFontName, size: myFontSize)
let attrParams = [
    NSAttributedString.Key.font: myRandomFont,
    NSAttributedString.Key.paragraphStyle: ps
    ] as [NSAttributedString.Key : Any]

let ns = NSString(string: text)
let toUseForDrawingBounds = ns.boundingRect(
    with: CGSize(width: boundsSize.width, height: .greatestFiniteMagnitude),
    options: [.usesLineFragmentOrigin, .usesFontLeading],
    attributes: attrParams,
    context: nil
)

在极少数情况下(对于某些 UIFonts)它可以正常工作,但对于大多数其他字体来说, toUseForDrawingBounds.height几乎总是 1 个空白行太大。(我的输入字符串文本总是用whitespacesAndNewlines修剪)

编辑 2:经过一些测试,我注意到情况并非如此。对于每个 UIFont(字体大小和文本的不同组合),返回的高度可能会过大 1 个空白行。当我计算行数(toUseForDrawingBounds.height / font.lineHeight)时,我清楚地看到有时返回的行数太多了。

我已经尝试过使用(sizeToFit 等)UITextViews、UILabels 等的技巧(StackOverflow)。没有任何效果。有任何想法吗?

编辑:举一个清晰的例子,看看附加的图像。黄色矩形约。表示返回toUseForDrawingBounds边界。我需要适当的边界高度,以便可以垂直居中绘制文本。

在此处输入图像描述

4

2 回答 2

1

您可以简单地使用size(withAttributes:)onString来获取它的heightand width,即

let text = "This is the sample text."
let textSize = text.size(withAttributes: [.font: myRandomFont, .paragraphStyle: ps])
print(textSize)

上面的代码只是你如何继续的一个例子。attributes根据您的要求添加。

于 2019-08-01T11:12:06.807 回答
0

虽然我不明白downvotes(因为它不是任何随机字体名称和随机文本组合的微不足道的解决方案),但我还是设法做到了大约。解决我的问题。

只是总结一下是否有人应该有同样的问题。我想为随机选择的字体名称随机选择的输入文本获得最佳字体大小, 以在指定的 CGRect内绘制(因此,wordWrapped)。

我这样做是这样的:

  1. 对于随机字体名称,我使用字符“W”并使用 String.size(withAttributes:) 和 NSLineBreakMode.byWordWrapping 我计算了最大可能(二进制搜索)字体大小以适应 CGRect
  2. 然后我检查了 fontSize > CGRect.height (是的,它可能发生!)并将 fontSize 减少到 CGRect.height (实际上这 2 步解决了我几乎所有的问题)
  3. 然后我只是 sqrt(pow(fontSize, 2) / numOfChars)) 得到大约。在 CGRect 中绘制文本的最佳字体大小
于 2019-08-05T11:24:27.517 回答