如何使用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"];
你仍然需要做所有的工作来确定分页符,但是我发现这是迄今为止最好的解决方法。