18

私は開発者 (TwoLivesLeft、Codea の作成者) に、アプリで構文の強調表示をどのように行っているかを尋ねました。彼は返事をした :

@TD2 Codea エディタは UITextView を使用して実装されています。強調表示は、サブビューを適切な位置 (通常は UILabels) にオーバーレイすることによって行われます。これらは、UITableViewCells の動作と同様に、再利用プールからデキューされます。スクロール中に、再ハイライトが必要な行はマーカーをプールから引き出し、画面外に移動した行はマーカーをプールに戻します。

特定の単語の x と y を取得する方法を誰か説明できますか?

4

2 に答える 2

41

UITextView は UITextInput に準拠しており、詳細な説明についてはこちらを参照してください。

必要なメソッド「textRangeFromPosition:toPosition:」、「positionFromPosition:offset:」、「positionFromPosition:inDirection:offset:」、および UITextInput プロトコルのその他のジオメトリベースのメソッドを見てください。それらはあなたが探している機能を提供するかもしれません。

私は実際にこれらがあなたが望むように機能することを確認しようとはしていませんが、それはあなたが必要としているもののように見えます.

さらにサポートが必要な場合はお知らせください。


アップデート:

これを行う方法のサンプルコードを次に示します。「firstRectForRange:」メソッドが機能するようになりました。このコードは基本的に、UITextView の「textStuff」の最後の 3 文字を取得し、緑色で強調表示します。

UITextView *textStuff = [[UITextView alloc] init];
textStuff.frame = CGRectMake(2.0, 200.0, 200.0, 40.0);
textStuff.text = @"how are you today?";
textStuff.textColor = [UIColor blackColor];

UITextPosition *Pos2 = [textStuff positionFromPosition: textStuff.endOfDocument offset: nil];
UITextPosition *Pos1 = [textStuff positionFromPosition: textStuff.endOfDocument offset: -3];

UITextRange *range = [textStuff textRangeFromPosition:Pos1 toPosition:Pos2];

CGRect result1 = [textStuff firstRectForRange:(UITextRange *)range ];

NSLog(@"%f, %f", result1.origin.x, result1.origin.y);

UIView *view1 = [[UIView alloc] initWithFrame:result1];
view1.backgroundColor = [UIColor colorWithRed:0.2f green:0.5f blue:0.2f alpha:0.4f];
[textStuff addSubview:view1];

このコードを実行した結果:

ここに画像の説明を入力

于 2012-07-14T20:22:59.990 に答える
5

@bddicken のhttps://stackoverflow.com/a/11487125/3549781は魅力的です。しかし問題は、テキストに改行「\n」が含まれている場合、iOS 7 以降では機能しないことです。多くの検索の後、私はそれに対する解決策を見つけました。

firstRectForRange を呼び出す前に、textView のレイアウトを確認する必要があります。

[textView.layoutManager ensureLayoutForTextContainer:textView.textContainer];

礼儀: UITextView firstRectForRange は、ミックスに改行文字があると機能しません

PS : 最初に、これを @bddicken の回答にコメントとして追加しました。ほとんどの人はコメントを読まないので、これを回答として追加しました。

于 2015-06-10T09:33:34.467 に答える