我使用这种方法将NSRange转换为CGRect,因为它与UITextView有关:
- (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它似乎忽略了一个事实,即有两个新的行字符?:/
如何使它与新的行字符一起工作?
发布于 2014-09-22 21:03:13
您可以强制self.textView确保textView的布局立即与
[self.textView.layoutManager ensureLayoutForTextContainer:self.textView.textContainer];把它放在你的frameOfTextRange之前:打电话会给你正确的答案。
发布于 2021-03-08 12:37:44
For swift 5
对于具有双断行且必须向下滚动的长textView,我发现即使在firstRectForRange之前添加了以下代码行之后,问题仍然存在:
[self.textView.layoutManager ensureLayoutForTextContainer:self.textView.textContainer];firstRectForRange仍然返回了一个错误的框架,但解决方案是确保在scrollViewDidScroll中的每个滚动之后进行布局。
对于斯威夫特5:
extension yourController {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
textView.layoutManager.ensureLayout(for:textView.textContainer)
}
}https://stackoverflow.com/questions/25604493
复制相似问题