7

私の目標は、TextKit を使用して、特定の単語の斜体化、テキスト サイズの設定などを行うことです。

まず、テキスト文字列内の文字を強調表示しようとしています。私は TextKit (そして正直なところプログラミング全般) に慣れていないので、obc.io issue #5 の構文強調トピックに従っています。

作成した UITextView に組み込まれている NSLayoutManager を使用すると、例外がスローされずにテキストが画面に表示されます。UITextView をビュー コントローラー (下記) の NSTextStorage サブクラスのレイアウト マネージャーとして設定すると、無効なグリフ インデックスの例外のエラーが発生します。

_textStorage = [BBRSyntaxHighlightTextStorage new]; 
[_textStorage addLayoutManager: self.readerTextView.layoutManager];

コンソール出力は次のとおりです。

_NSLayoutTreeLineFragmentRectForGlyphAtIndex invalid glyph index 528
2013-12-01 15:23:24.949 BibleReader[6077:70b] !!! _NSGlyphTreeInvalidateGlyphsForCharacterRange invalid char range 1
2013-12-01 15:23:24.956 BibleReader[6077:70b] !!! _NSLayoutTreeLineFragmentRectForGlyphAtIndex invalid glyph index 528
2013-12-01 15:23:24.957 BibleReader[6077:70b] !!! _NSGlyphTreeInvalidateGlyphsForCharacterRange invalid char range 1
2013-12-01 15:23:24.957 BibleReader[6077:70b] !!! _NSGlyphTreeInvalidateGlyphsForCharacterRange character count mismatch
2013-12-01 15:23:24.958 BibleReader[6077:70b] !!! _NSLayoutTreeLineFragmentRectForGlyphAtIndex invalid glyph index 4040
2013-12-01 15:23:24.959 BibleReader[6077:70b] !!! _NSGlyphTreeInvalidateGlyphsForCharacterRange invalid char range 1

Apple のテキスト プログラミング ガイドを何度も読み、テキスト システムがどのように確立されているかを理解していると思いますが、グリフ数がグリフ数を超える理由がわかりません...

viewController と NSTextStorage サブクラスの gist をそれぞれherehereに作成しました。

4

1 に答える 1

9

レイアウト マネージャーが元のNSTextStorageオブジェクトから適切に削除されていないようです。[self.readerTextView.textStorage removeLayoutManager:self.readerTextView.layoutManager]レイアウト マネージャーをカスタム テキスト ストレージ サブクラスに追加する前に呼び出します。

UITextView一般に、TextKit オブジェクトのカスタム サブクラスで作成された nib/xib/storyboard を混在させると、TextKit がうまく動作しないことがわかりました。必要なクラスを使用してテキスト システムをオーバーライドおよび構築することで、この問題の一部を回避できます- (id)awakeAfterUsingCoder:(NSCoder *)aDecoderUITextView、通常は、コード内のカスタム テキスト システムの作成に固執することをお勧めします。

于 2013-12-11T04:39:20.077 に答える