获取CGRect以获取UITextView中的文本,以便使用CALayer进行突出显示

时间:2013-12-15 20:33:05

标签: ios uitextview calayer textkit nstextcontainer

我正在尝试在UITextView中绘制透明的CALayer,以便在搜索中突出显示匹配的文本。

我已经找到了正确的方法,但仍未找到正确的坐标。我需要找到文本容器的来源。现在,我得到了textView的原点,并通过它来偏移图层的原点:

NSRange match = [[[self textView]text]rangeOfString:@"predict the future"];
NSRange glyphRange = [manager glyphRangeForCharacterRange:match actualCharacterRange:NULL];

CGRect textRect = [manager boundingRectForGlyphRange:glyphRange inTextContainer:[[self textView]textContainer]];

CGPoint textViewOrigin = self.textView.frame.origin;
textRect.origin.x += (textViewOrigin.x / 2);
textRect.origin.y += (textViewOrigin.y / 2);


CALayer* roundRect = [CALayer layer];
[roundRect setFrame:textRect];
[roundRect setBounds:textRect];

[roundRect setCornerRadius:5.0f];
[roundRect setBackgroundColor:[[UIColor blueColor]CGColor]];
[roundRect setOpacity:0.2f];
[roundRect setBorderColor:[[UIColor blackColor]CGColor]];
[roundRect setBorderWidth:3.0f];
[roundRect setShadowColor:[[UIColor blackColor]CGColor]];
[roundRect setShadowOffset:CGSizeMake(20.0f, 20.0f)];
[roundRect setShadowOpacity:1.0f];
[roundRect setShadowRadius:10.0f];

[[[self textView]layer]addSublayer:roundRect];

如果我移动文本字段,或者如果我不将偏移量除以2,则得到以下结果: The layer frame is off

我想知道我是否在正确的轨道上,以及如何找到NSTextContainer对象的来源。

2 个答案:

答案 0 :(得分:8)

要正确定位图层,您只需将self.textView.textContainerInset.top添加到textRect.origin.y,而不是文本视图的原点。

但正如我在评论中所说的,如果你的比赛跨越两条线,它将无法正常运作。您可能需要设置匹配范围的背景颜色以突出显示它(使用attributedText属性),但是您无法添加圆角或阴影。

答案 1 :(得分:1)

[textView textContainerInset]

使用文本视图的原点不起作用,因为可以在其他地方更改insets。例如,如果父视图控制器的automaticAdjustsScrollViewInsets属性为YES,或者正在进行某些自定义文本容器布局。

UIEdgeInsets textContainerInset = [[self textView]textContainerInset];
textRect.origin.x += textContainerInset.left;
textRect.origin.y += textContainerInset.top;

这是一种解决方案,可以使几何图形正确,但如果文本跨越两行则不行。