我是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];
答案 0 :(得分:1)
发生这种情况的原因是firstRectForRange
将为您提供一个不会超过1行的矩形。只要文本/所选文本保持在一行中,矩形就会覆盖它。
原因是:想象一下,您选择跨越一行半的文本。因此,当您选择文本时,选择颜色将显示选择边界不是矩形。它更像是倒L。因此,单矩形无法覆盖它。
如果您只想突出显示所选文本,则必须使用多个rects。请参阅我的代码here。我已经覆盖了多行,以及具有不同矩形的单词。您可以设置颜色和透明度(alpha
)以感受突出显示。但这里的缺点是,你将无法与该文本互动。
如果要创建覆盖所有选定文本的单个矩形,则它将覆盖所选文本后面的文本,但您可以使用单个矩形。为此,您必须使用firstRectForRange
两次。一旦选定第一个单词,第二个单词就在所选文本的 last 行中选择的第一个单词。使用MAX
和MIN
创建一个涵盖所有文字的矩形。
替代方法
UITextView
支持AttributedText
。使用此功能,您可以使用包含多个属性的字符串(粗体,斜体,彩色文本,彩色背景等)设置UITextView
的文本。使用NSMutableAttributedStrings
存储您的文字。添加如下属性:
[myAttriButedText addAttribute:NSBackgroundColorAttributeName value:UIColorFromRGB(0x333333) range:NSMakeRange(0, [myAttriButedText length])];
使用UITextView
或setAttributedText
设置textView.attributedText =
的文字。这样,您可以轻松地在文本上添加背景颜色,而不会出现上述所有问题。但是如果你想要更多只有NSAttributedString
支持的属性,你将不得不使用上面提到的方法。