3

iOSでCGContextを使用して、画像の複数の「ページ」を描画しています。私は自分のアプリでsizeWithFontとdrawInRectの組み合わせを広範囲に使用しました。私がする必要があるのは、テキストの大きな塊を複数のページに分割することです。サイズを変更して、別のページが必要かどうかを判断できますが、どこで切り刻むかを知るにはどうすればよいですか?ページに完全に適合する文字列の長さが見つかるまで単語ごとにチェックするために醜いループを実行し、その時点で文字列を切り刻む必要がありますか?より賢い方法はありますか?

何か案は?

ありがとう。

4

2 に答える 2

6

テキストを描画するための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 で導入されましたが、古いバージョンで必要な場合は自分で計算できます。

于 2011-02-11T05:20:12.217 に答える
2

この問題を回避する方法は、改行で分割することです。

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

改ページなどを判断するためにすべての作業を行う必要がありますが、これが最善の回避策であることがわかりました。

于 2012-11-16T05:16:36.553 に答える