UITextView文本中的颜色变化

时间:2013-10-04 16:27:39

标签: iphone ios uitextview

我是iPhone的新手。

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

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

所以有人可以告诉我这个如何改变我选择的所有文本的背景颜色。

 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];

1 个答案:

答案 0 :(得分:1)

发生这种情况的原因是firstRectForRange将为您提供一个不会超过1行的矩形。只要文本/所选文本保持在一行中,矩形就会覆盖它。

原因是:想象一下,您选择跨越一行半的文本。因此,当您选择文本时,选择颜色将显示选择边界不是矩形。它更像是倒L。因此,矩形无法覆盖它。

  • 如果您只想突出显示所选文本,则必须使用多个rects。请参阅我的代码here。我已经覆盖了多行,以及具有不同矩形的单词。您可以设置颜色和透明度(alpha)以感受突出显示。但这里的缺点是,你将无法与该文本互动。

  • 如果要创建覆盖所有选定文本的单个矩形,则它将覆盖所选文本后面的文本,但您可以使用单个矩形。为此,您必须使用firstRectForRange两次。一旦选定第一个单词,第二个单词就在所选文本的 last 行中选择的第一个单词。使用MAXMIN创建一个涵盖所有文字的矩形。

替代方法 UITextView支持AttributedText。使用此功能,您可以使用包含多个属性的字符串(粗体,斜体,彩色文本,彩色背景等)设置UITextView的文本。使用NSMutableAttributedStrings存储您的文字。添加如下属性:

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

使用UITextViewsetAttributedText设置textView.attributedText =的文字。这样,您可以轻松地在文本上添加背景颜色,而不会出现上述所有问题。但是如果你想要更多只有NSAttributedString支持的属性,你将不得不使用上面提到的方法。