3

我正在使用 iOS 中的 CGContext 绘制多个图像“页面”。我在我的应用程序中广泛使用了 sizeWithFont 和 drawInRect 组合。我需要做的是在多个页面上拆分一大块文本。我可以调整它的大小并确定它是否需要另一页,但我怎么知道在哪里切呢?我是否必须做一个丑陋的循环来逐字检查,直到找到一个完全适合页面的字符串长度,然后在该点切断字符串?有没有更聪明的方法?

有任何想法吗?

谢谢。

4

2 回答 2

6

NSString 添加到 UIKit 用于绘制文本,您可以预先确定为给定字体呈现给定文本所需的确切空间量。如果将文本分成页面,您可以使用此方法。

– sizeWithFont:constrainedToSize:lineBreakMode:

假设已知字体和换行模式,创建一个与页面宽度相同的 CGSize,并为高度使用足够的数字。这将是我们限制文本的最大尺寸。

CGSize maximumSize = CGSizeMake(pageWidth, 999999999);
CGSize expectedSize = [veryLongString sizeWithFont:theFont constrainedToSize:maximumSize lineBreakMode:theLineBreakMode];

expectedSize将告诉我们文本将采用的大小,假设它可以垂直无限延伸(非常接近)。要找到所需的页数,只需将总高度除以一页的高度即可。

NSInteger totalPages = ceil(expectedSize.height / heightOfOnePage);

您还需要调整一页的高度,以确保最后一行文本不会被剪裁。为此,页面的高度应该是字体行高的倍数。假设初始页面高度是300px,字体高度是16px,那么会有一些剪裁,因为300/16 = 18.75它不是一个整数。

NSInteger linesWithoutClipping = floor(initialPageHeight / theFont.lineHeight);
CGFloat optimalPageHeight = linesWithoutClipping * theFont.lineHeight;

取 floor 值18并乘以字体 line height 16,我们得到一个最佳页面高度,288以确保没有剪裁。

请注意,lineHeight 是在 iOS 4.0 中引入的,但如果旧版本需要,您可以自己计算。

于 2011-02-11T05:20:12.217 回答
2

我解决这个问题的方法是按行返回拆分。

NSArray * paragraphs = [text componentsSeparatedByString:@"\n"];

您仍然需要完成所有工作来确定分页符等,但我发现这是迄今为止最好的解决方法。

于 2012-11-16T05:16:36.553 回答