我使用此方法将NSRange转换为与GITextView相关的CGRect:
- (CGRect)frameOfTextRange:(NSRange)range inTextView:(UITextView *)textView
{
UITextPosition *beginning = textView.beginningOfDocument;
UITextPosition *start = [textView positionFromPosition:beginning offset:range.location];
UITextPosition *end = [textView positionFromPosition:beginning offset:range.location+range.length];
UITextRange *textRange = [textView textRangeFromPosition:start toPosition:end];
CGRect rect = [textView firstRectForRange:textRange];
return rect;
}
This question的回答是有人问我同样的问题。上述方法适用于此:
这是一个伟大的文本字段是的,它是findthistoken
不像这样:
this is a great one
(new line)
(new line)
findthistoken
似乎只是忽略了有2个新行字符的事实? :/
如何使用新的换行符?
答案 0 :(得分:10)
您可以强制self.textView立即使用
确保textView的布局 [self.textView.layoutManager ensureLayoutForTextContainer:self.textView.textContainer];
在你的frameOfTextRange:call之前放置它会给你正确的矩形。
答案 1 :(得分:0)
对于 swift 5
对于带有几个换行符并且必须向下滚动的长 textView,我发现即使在 firstRectForRange 之前添加以下代码行后问题仍然存在:
[self.textView.layoutManager ensureLayoutForTextContainer:self.textView.textContainer];
firstRectForRange 仍然返回了一个错误的框架,但解决这个问题的方法是在 scrollViewDidScroll 中确保每次滚动后的布局。
对于 swift 5:
extension yourController {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
textView.layoutManager.ensureLayout(for:textView.textContainer)
}
}