54

テキストビューでさまざまな範囲のピクセル フレームを見つける必要があります。私はそれを行うために使用し- (CGRect)firstRectForRange:(UITextRange *)range;ています。ただし、実際に作成する方法がわかりませんUITextRange

基本的に、これは私が探しているものです:

- (CGRect)frameOfTextRange:(NSRange)range inTextView:(UITextView *)textView {

    UITextRange*range2 = [UITextRange rangeWithNSRange:range]; //DOES NOT EXIST 
    CGRect rect = [textView firstRectForRange:range2];
    return rect;
}

Apple は、プロトコルを採用するためにサブクラスUITextRange化する必要があると述べています。私はそれをしませんが、ドキュメントのサンプルコードに従い、クラッシュするサブクラスを渡すことを試みました。UITextPositionUITextInputfirstRectForRange

テキストビューに異なる色を追加する簡単な方法があればUILables教えてください。TRUE に設定して UIWebView を使用してみcontent editableましたが、JS との通信が好きではなく、必要なのはカラーリングだけです。

前もって感謝します。

4

6 に答える 6

99

メソッドでテキスト範囲を作成できますtextRangeFromPosition:toPosition。この方法では 2 つの位置が必要になるため、範囲の開始位置と終了位置を計算する必要があります。positionFromPosition:offsetこれは、別の位置からの位置と文字オフセットを返すメソッドで行われます。

- (CGRect)frameOfTextRange:(NSRange)range inTextView:(UITextView *)textView
{
    UITextPosition *beginning = textView.beginningOfDocument;
    UITextPosition *start = [textView positionFromPosition:beginning offset:range.location];
    UITextPosition *end = [textView positionFromPosition:start offset:range.length];
    UITextRange *textRange = [textView textRangeFromPosition:start toPosition:end];
    CGRect rect = [textView firstRectForRange:textRange];
    return [textView convertRect:rect fromView:textView.textInputView];
}
于 2012-03-07T17:36:20.587 に答える
17

こんなに複雑に見えるのはちょっとばかげています。簡単な「回避策」は、範囲を選択して (NSRange を受け入れる)、selectedTextRange を読み取る (UITextRange を返す) ことです。

- (CGRect)frameOfTextRange:(NSRange)range inTextView:(UITextView *)textView {
    textView.selectedRange = range;
    UITextRange *textRange = [textView selectedTextRange]; 
    CGRect rect = [textView firstRectForRange:textRange];
    return rect;
}

textView がファーストレスポンダーでなくても、これはうまくいきました。


選択を維持したくない場合は、selectedRange をリセットすることができます。

textView.selectedRange = NSMakeRange(0, 0);

...または現在の選択を保存し、後で復元します

NSRange oldRange = textView.selectedRange;
// do something
// then check if the range is still valid and
textView.selectedRange = oldRange;
于 2013-10-05T20:13:30.413 に答える
6

タイトルの質問に対して、NSRange から UITextRange を作成するSwift 2 拡張機能を次に示します。

UITextRange の唯一の初期化子は UITextInput プロトコルのインスタンス メソッドであるため、拡張機能ではUITextFieldUITextViewなどの UITextInput を渡す必要もあります。

extension NSRange {
    func toTextRange(textInput textInput:UITextInput) -> UITextRange? {
        if let rangeStart = textInput.positionFromPosition(textInput.beginningOfDocument, offset: location),
            rangeEnd = textInput.positionFromPosition(rangeStart, offset: length) {
            return textInput.textRangeFromPosition(rangeStart, toPosition: rangeEnd)
        }
        return nil
    }
}
于 2016-05-18T19:53:19.620 に答える