当混合中出现新行字符时,UITextView firstRectForRange无法正常工作

时间:2014-09-01 11:09:01

标签: ios uitextview nsrange

我使用此方法将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个新行字符的事实? :/

如何使用新的换行符?

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)
    }
}