0

現在、NSString の drawInRect を使用してフォントを表示しています。これは、OpenGL で使用されるテクスチャにアップロードされます。

例:

[String drawInRect:textRect withFont:font lineBreakMode:UILineBreakModeCharacterWrap     alignment:UITextAlignmentLeft];

今必要なのは、[x,y] がクリックされた場合に文字のインデックスを決定する方法です。したがって、[0,0] を渡すと、インデックス [0] が返されます。または [24,4] は、たとえば 5 を返します。

これを行う 1 つの方法は、描画されたグリフの個々のバウンディング ボックスを取得し、それらを反復処理できる場合です。

または、この種の機能を可能にするテキストを描画するより良い方法はありますか?

4

2 に答える 2

2

NSString および NSAttributedString 描画メソッドでこれを行うことはできません。タップ可能なテキストを作成するには、次の 3 つの方法のいずれかをお勧めします。

1) Core Text PRO: 高速で、古いバージョンの iOS で動作します。CON: 定型文がたくさんあります。属性付き文字列を作成するときに使用する非常に冗長なテキスト属性の NSDictionaries を作成し、drawRect:実装内でそれらの属性付き文字列を使用してCTFrameSetterviaを作成CTFramesetterCreateWithAttributedString()し、フレームセッターを使用して を作成しCTFrame、 を使用しCTFrameてテキストを描画する必要があります。うわー!結局のところ、CTFrame(さらに複雑なコードを使用して) をクエリして、特定の でタップされた文字のインデックスを見つけることができますCGPoint。これらすべてを設定するのは簡単ではありません。

2) TextKit PRO: Core Text よりもはるかに簡単です。CON: iOS 7 でのみ使用できます。新しいプロパティ (および)UITextViewによって公開されるメソッドと一緒に を使用して、CGPoint に指定された文字列情報を取得できます。NSLayoutManagerNSTextContainer

3) TTTAttributedLabelを使用します。PRO: 最も簡単で、古いバージョンの iOS で動作します。CON: 必要な機能が提供されない場合があります。

于 2013-09-18T19:01:38.710 に答える
0

使用することをお勧めします:

NSUInteger count = [string length];
CGFloat widths[length];
for(int i=0; i<count; ++i) {
  widths[i] = [string sizeWithFont:font forWidth:10000 lineBreakMode: UILineBreakModeWordWrap].width;
}

次に、この配列を歩いてスポットを見つけます

于 2012-08-22T12:49:55.660 に答える