10

参考までに、Twitter アプリのスクリーンショットを次に示します: http://screencast.com/t/YmFmYmI4M

私がやりたいことは、複数の行にまたがる可能性がある NSAttributedString の部分文字列の上にフローティング ポップオーバーを配置することです。NSAttributedString はプロジェクトの要件です。

提供されたスクリーンショットでは、リンクが背景で強調表示されていることがわかるため、CoreText と NSAttributedStrings を使用していると思われます。CTRunRef ( http://developer.apple.com/library/ios/#documentation/Carbon/Reference/CTRunRef/Reference/reference.html ) と呼ばれるものも見つけました。概念的に。

要するに、コア テキストに段落があり、単語をタップした場合、その単語の境界ボックスを見つけるにはどうすればよいでしょうか?

4

4 に答える 4

8

表示には影響しないが、別のグリフ実行としてレイアウトされる属性付き文字列に属性を設定し、CoreText を使用して文字列をレイアウトします。

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString);
CTFrameRef ctframe = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);

ここで、関連するテキストのチャンクを見つけるために、フレームを探し回る必要があります。で の配列を取得CTLineRefCTFrameGetLines()ます。

配列を反復処理し、タッチがその行にあったかどうかをテストしCTLineGetImageBounds()ます。そうである場合は、行内のグリフの実行を調べます。

CTRunRef繰り返しますが、 でs の配列を取得できますCTLineGetGlyphRuns()。を使用してタップがグリフ ラン内にあったかどうかを確認しCTRunGetImageBounds()ます。そうであった場合は、グリフ ランが対応する元の属性付き文字列のインデックスの範囲を で見つけることができますCTRunGetStringIndices()

于 2010-09-26T03:56:48.677 に答える
3

Y を CTLine で、X を CTRun の幅と高さで検索する必要があります。単語とフォント自体で取得できます。私のプロジェクトのリンクを添付してください。これは本当に単純なコードですが、ニーズを満たすために再編集できます。一般的なロジックを改善する場合は、乾杯に役立つことを願っています。thx. textViewProject

于 2010-11-26T13:00:48.340 に答える
2

ジョージによって与えられたリンクは非常に役に立ち、私が欲しいものを手に入れました。しかし、奇妙なことが起こりました。iOS SDK 4.0では機能していましたが、iOS SDK 5では、リンクの位置がビューの間違った位置に表示されていました。

そのため、コードを少し調整する必要がありました。タッチ可能なボタンのx座標については、 CTRunGetImageBounds関数の代わりにCTRunGetTypographicBoundsを使用する必要がありました。

したがって、全体として、微調整されたコードでは、y座標、幅、および高さは CTRunGetImageBoundsを使用して計算されました。また、x座標はCTRunGetTypographicBoundsを使用して計算されました。

于 2011-08-03T05:00:27.770 に答える
0

私はまさにそれを行う小さなライブラリに取り組んできました。ここで見つけることができます: https://github.com/pothibo/CMFramework

ただし、このライブラリはアルファ段階にあり、最適化が必要であり、いくつかの機能が不足しています (行の高さは、追加したい緊急の機能の 1 つです)。

それを使用して問題を見つけることにした場合は、遠慮なく github に問題を投稿してください。

于 2010-12-25T17:17:46.420 に答える