我在iOS中使用CGContext绘制了多个“页面”图像。我在我的应用程序中广泛使用了sizeWithFont和drawInRect组合。我需要做的是在多个页面中分割大量文本。我可以调整它的大小并确定它是否需要另一页,但我怎么知道在哪里砍它?我是否必须做一个丑陋的循环来逐字检查,直到找到一个完全适合页面的字符串长度,然后在那个时候切断字符串?有更聪明的方法吗?
有什么想法吗?
感谢。
答案 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"];
你仍然需要做所有工作来确定分页符等,但我发现这是目前为止最好的解决方法。