如何使用NSString的sizeWithFont和drawInRect来训练要绘制多少字符串

时间:2011-02-11 05:07:10

标签: iphone ios cgcontext sizewithfont

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

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:6)

用于绘制文本的NSString additions到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;

取底线值18并乘以字体高度16,我们得到288的最佳页面高度,以确保没有裁剪。

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

答案 1 :(得分:2)

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

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

你仍然需要做所有工作来确定分页符等,但我发现这是目前为止最好的解决方法。