如何使用NSString的sizeWithFont和drawInRect来锻炼多lessstring来绘制

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

有任何想法吗?

谢谢。

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

– sizeWithFont:constrainedToSize:lineBreakMode: 

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

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

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

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

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

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

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

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

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

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

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