首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当混合中有新的行字符时,UITextView firstRectForRange不能工作

当混合中有新的行字符时,UITextView firstRectForRange不能工作
EN

Stack Overflow用户
提问于 2014-09-01 11:09:01
回答 2查看 1.7K关注 0票数 3

我使用这种方法将NSRange转换为CGRect,因为它与UITextView有关:

代码语言:javascript
复制
- (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

不像这样伟大:

代码语言:javascript
复制
this is a great one
(new line)
(new line)
findthistoken

它似乎忽略了一个事实,即有两个新的行字符?:/

如何使它与新的行字符一起工作?

EN

回答 2

Stack Overflow用户

发布于 2014-09-22 21:03:13

您可以强制self.textView确保textView的布局立即与

代码语言:javascript
复制
 [self.textView.layoutManager ensureLayoutForTextContainer:self.textView.textContainer];

把它放在你的frameOfTextRange之前:打电话会给你正确的答案。

票数 11
EN

Stack Overflow用户

发布于 2021-03-08 12:37:44

For swift 5

对于具有双断行且必须向下滚动的长textView,我发现即使在firstRectForRange之前添加了以下代码行之后,问题仍然存在:

代码语言:javascript
复制
[self.textView.layoutManager ensureLayoutForTextContainer:self.textView.textContainer];

firstRectForRange仍然返回了一个错误的框架,但解决方案是确保在scrollViewDidScroll中的每个滚动之后进行布局。

对于斯威夫特5:

代码语言:javascript
复制
extension yourController {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        textView.layoutManager.ensureLayout(for:textView.textContainer)
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25604493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档