0

これは可能ですか?基本的に、NSAttributedString オブジェクトと対応する CTLine オブジェクトがたくさんあります。drawRect ステージの前に画像の境界を取得したい。したがって、この時点では、引き込むものは何もありません。次に、これらの画像境界を使用して、描画用に何を作成する必要があるかを正確に決定します。

編集: サイズの別の測定は、おそらく問題なく機能します。しかし、一見して名前が付けられた CTLineGetTypographicBounds 関数を呼び出すと、幅のみが返されます。上昇浮動小数点数と下降浮動小数点数のアドレスを渡すと、ゼロとして返されます。

編集:与えられた答えはMacOSでうまく機能します。誰でもiOSでできますか?

4

4 に答える 4

2

はい、できますが、それほど簡単ではありません。

一般的にCTLineGetTypographicBounds()を使用する必要があります。これは、私にとってはascentdescent、およびLeadingを返します、少し混乱してます。フォントの最大下降 - 下降文字があるかどうかに関係なく。

もう 1 つの方法は、行から CTRun を取得し( CTLineGetGlyphRuns )、グリフ配列を取得し ( CTRunGetGlyphsまたはCTRunGetGlyphsPtr )、CTFontGetBoundingRectsForGlyphsおよびCTFontGetAdvancesForGlyphsを使用して必要な情報を構築することです。

編集:私はこのメソッドを見つけました: " - (NSRect) boundingRectWithSize:(NSSize)size options:(NSStringDrawingOptions)options " のNSAttributedStringは、まさに必要なことをしているようです。

希望、これは役に立ちます...

于 2011-11-25T12:01:51.240 に答える
2

によって返されるCTLineGetTypographicBounds()境界は、画像の境界と同じではありません。名前(およびИванの答え)が示すように、上昇などはフォントに対して定義されており、文字列に基づいて変更されません。たとえば、複数行のテキストがある場合に正しい行の高さを見つけたい場合に使用します。行の高さは通常、使用する正確な文字に依存しないためです。

CTLineGetImageBounds()一方、画像に正確に適合する境界を返します。たとえば、1 本の線の周りにボックスを描きたい場合は、これが必要です。

CTLineGetImageBounds()テキスト変換などがある可能性があるため、コンテキストが必要です。それについて心配したくない場合は、ダミーのコンテキストを使用してください。例えば:

CTLineRef line;

// create the line...

UIGraphicsBeginImageContext(CGSizeMake(1, 1));
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetTextPosition(context, 0, 0);
CGRect bounds = CTLineGetImageBounds(line, context);
UIGraphicsEndImageContext();

// use bounds...
于 2012-01-23T22:45:34.540 に答える
2

iOS6+ 向けに開発している場合。次の方法を使用できます。

CTLineRef line;
// Create the line...

CGRect bounds = CTLineGetBoundsWithOptions(line, kCTLineBoundsUseGlyphPathBounds);
// use bounds...

これにより、コンテキストに変換が適用されていないと仮定した場合と同じ境界が得られCTLineGetImageBounds()ますが、コンテキストは必要ありません。iOS 5 以下の場合は、Иван で説明されている方法を使用する必要があります。

CTLineGetTypographicBounds()この関数または画像の境界とは異なる幅が得られます。理由はわかりません。また、返されるアセントとディセントはフォントのものであり、フォントに表示される文字ではありません。CTLineRef.

于 2013-09-05T07:33:23.560 に答える
0

もう 1 つの方法は、最初の関数から取得したグリフ配列を使用して文字列をグリフに変換しCTFontGetGlyphsForCharacters()、呼び出すことです。CTFontGetBoundingRectsForGlyphs()後者の関数は、「グリフ ランの全体的な境界四角形」を返すため、個々の境界四角形で処理を行う必要はありません。これらの機能を両方とも iOS で正常に使用した場合。

これを行う場合、特に文字列に英語以外の文字が含まれている場合、グリフと文字の間のマッピングが必ずしも 1 対 1 ではないことに注意してください。

于 2012-09-17T02:49:27.987 に答える