我正在使用 iOS 中的 CGContext 绘制多个图像“页面”。我在我的应用程序中广泛使用了 sizeWithFont 和 drawInRect 组合。我需要做的是在多个页面上拆分一大块文本。我可以调整它的大小并确定它是否需要另一页,但我怎么知道在哪里切呢?我是否必须做一个丑陋的循环来逐字检查,直到找到一个完全适合页面的字符串长度,然后在该点切断字符串?有没有更聪明的方法?
有任何想法吗?
谢谢。
我正在使用 iOS 中的 CGContext 绘制多个图像“页面”。我在我的应用程序中广泛使用了 sizeWithFont 和 drawInRect 组合。我需要做的是在多个页面上拆分一大块文本。我可以调整它的大小并确定它是否需要另一页,但我怎么知道在哪里切呢?我是否必须做一个丑陋的循环来逐字检查,直到找到一个完全适合页面的字符串长度,然后在该点切断字符串?有没有更聪明的方法?
有任何想法吗?
谢谢。
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 中引入的,但如果旧版本需要,您可以自己计算。
我解决这个问题的方法是按行返回拆分。
NSArray * paragraphs = [text componentsSeparatedByString:@"\n"];
您仍然需要完成所有工作来确定分页符等,但我发现这是迄今为止最好的解决方法。