テキストを描画するためのUIKitへのNSStringの追加により、特定のフォントの特定のテキストをレンダリングするために必要な正確なスペース量を事前に決定できます。テキストをページに分割する場合は、この方法を使用できます。
– sizeWithFont:constrainedToSize:lineBreakMode:
フォントと改行モードが既知であると仮定して、ページと同じ幅を持つ CGSize を作成し、高さに十分な数値を使用します。これは、テキストを制限する最大サイズになります。
CGSize maximumSize = CGSizeMake(pageWidth, 999999999);
CGSize expectedSize = [veryLongString sizeWithFont:theFont constrainedToSize:maximumSize lineBreakMode:theLineBreakMode];
expectedSize
は、テキストが垂直方向に無限に伸びることができると仮定して (かなり近い)、テキストが取るサイズを教えてくれます。必要なページ数を見つけるには、全体の高さを 1 ページの高さで割ります。
NSInteger totalPages = ceil(expectedSize.height / heightOfOnePage);
テキストの最後の行が切り取られないように、1 ページの高さを調整することもできます。そのためには、ページの高さをフォントの行の高さの倍数にする必要があります。最初のページの高さが300px
で、フォントの高さがであるとすると、整数ではない16px
クリッピングが発生します。300/16 = 18.75
NSInteger linesWithoutClipping = floor(initialPageHeight / theFont.lineHeight);
CGFloat optimalPageHeight = linesWithoutClipping * theFont.lineHeight;
floor の値18
に font line height を掛けると、クリッピングがないように16
最適なページの高さが得られます。288
lineHeight は iOS 4.0 で導入されましたが、古いバージョンで必要な場合は自分で計算できます。