0

我是 iPhone 新手。

我有一个文本视图。我正在更改文本视图中选定文本的背景颜色。

但问题是当我在 textView 中选择多于 1 行时,只有第一行颜色被更改,而不是其他行颜色。

所以任何人都可以告诉我如何更改我选择的所有文本的背景颜色。??

 tagValue = textView.tag;

    NSRange r = textView.selectedRange;
 UITextRange     *selectedRange = [textView selectedTextRange];

    if (!selectedRange)
        return;

    CGRect result1 = [textView firstRectForRange:selectedRange];
    frame_selectedText = result1;


self.str_selected =[NSString stringWithFormat:@"%@", [textView.text substringWithRange:NSMakeRange(r.location, r.length)]];
 UIButton  *btnView = [UIButton buttonWithType:UIButtonTypeCustom];
        [btnView setFrame:result1];

 [btnView addTarget:self action:@selector(buttonColorClicked:) forControlEvents:UIControlEventTouchUpInside];
        btnView.backgroundColor = [UIColor colorWithRed:220.0f/255.0f green:248.0f/255.0f blue:188.0f/255.0f alpha:0.5];

    [textView addSubview:btnView];
4

1 回答 1

1

发生这种情况的原因是这firstRectForRange会给你一个不会超过 1 行的矩形。只要文本/选定文本保留在一行中,矩形就会覆盖它。

原因是:假设您选择了跨越一行半的文本。所以当你选择文本时,选择颜色会告诉你选择边界不是矩形。它更像是一个倒置的 L。因此,单个rect 无法覆盖它。

  • 如果您只想突出显示选定的文本,则必须使用多个矩形。在这里查看我的代码。我已经涵盖了多行,以及具有不同矩形的单词。您可以设置颜色和透明度 ( alpha) 以给人一种突出的感觉。但这里的缺点是,您将无法与该文本进行交互。

  • 如果您想创建一个覆盖所有选定文本的矩形,那么它将覆盖选定文本之后的文本,但您可以使用单个矩形。为此,您将不得不使用firstRectForRange两次。一次在所选的第一个单词上,第二次在所选文本的最后一行中选择的第一个单词上。使用MAXMIN创建一个覆盖所有文本的矩形。

替代方法 UITextView支持AttributedTexts。有了这个,您可以UITextView使用具有多个属性(粗体、斜体、彩色文本、彩色背景等)的字符串设置文本。用于NSMutableAttributedStrings存储您的文本。添加如下属性:

[myAttriButedText addAttribute:NSBackgroundColorAttributeName value:UIColorFromRGB(0x333333) range:NSMakeRange(0, [myAttriButedText length])];

UITextView并设置使用setAttributedText, 或的文本textView.attributedText =。这样,您可以轻松地在文本上添加背景颜色,而无需上述所有麻烦。但是如果你想要的不仅仅是NSAttributedStrings 支持的属性,你将不得不使用上面提到的方法。

于 2013-10-07T10:11:34.543 回答