NSStringのsizeWithFontおよびdrawInRectを使用して、描画する文字列の量を計算する方法

cgcontext ios iphone sizewithfont
NSStringのsizeWithFontおよびdrawInRectを使用して、描画する文字列の量を計算する方法

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

何か案は?

ありがとう。

  3  6


ベストアンサー

テキストを描画するためのUIKitへのhttp://developer.apple.com/library/ios/#documentation/UIKit/Reference/NSString_UIKit_Additions/Reference/Reference.html[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`であり、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で導入されましたが、古いバージョンで必要な場合は自分で計算できます。

6


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

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

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

2


タイトルとURLをコピーしました