首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从NSRange创建UITextRange

从NSRange创建UITextRange
EN

Stack Overflow用户
提问于 2012-02-03 17:53:48
回答 6查看 32K关注 0票数 54

我需要在文本视图中找到不同范围的像素帧。我正在使用- (CGRect)firstRectForRange:(UITextRange *)range;来做这件事。然而,我不知道如何实际创建一个UITextRange

基本上这就是我要找的:

代码语言:javascript
运行
复制
- (CGRect)frameOfTextRange:(NSRange)range inTextView:(UITextView *)textView {

    UITextRange*range2 = [UITextRange rangeWithNSRange:range]; //DOES NOT EXIST 
    CGRect rect = [textView firstRectForRange:range2];
    return rect;
}

苹果公司表示,为了采用UITextInput协议,必须对UITextRangeUITextPosition进行子类化。我没有这样做,但我还是尝试了,遵循文档的示例代码,并将子类传递给firstRectForRange,这导致了崩溃。

如果有更简单的方法将不同颜色的UILables添加到文本视图中,请告诉我。我尝试过在content editable设置为TRUE的情况下使用UIWebView,但我不喜欢与JS通信,而着色是我唯一需要的东西。

提前谢谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-03-08 01:36:21

您可以使用textRangeFromPosition:toPosition方法创建文本范围。此方法需要两个位置,因此需要计算范围的开始和结束位置。这是通过方法positionFromPosition:offset完成的,该方法返回另一个位置的位置和字符偏移量。

代码语言:javascript
运行
复制
- (CGRect)frameOfTextRange:(NSRange)range inTextView:(UITextView *)textView
{
    UITextPosition *beginning = textView.beginningOfDocument;
    UITextPosition *start = [textView positionFromPosition:beginning offset:range.location];
    UITextPosition *end = [textView positionFromPosition:start offset:range.length];
    UITextRange *textRange = [textView textRangeFromPosition:start toPosition:end];
    CGRect rect = [textView firstRectForRange:textRange];
    return [textView convertRect:rect fromView:textView.textInputView];
}
票数 98
EN

Stack Overflow用户

发布于 2013-10-06 04:13:30

看起来如此复杂,这有点可笑。一个简单的“变通办法”是选择范围(接受NSRange),然后读取selectedTextRange (返回UITextRange):

代码语言:javascript
运行
复制
- (CGRect)frameOfTextRange:(NSRange)range inTextView:(UITextView *)textView {
    textView.selectedRange = range;
    UITextRange *textRange = [textView selectedTextRange]; 
    CGRect rect = [textView firstRectForRange:textRange];
    return rect;
}

这对我来说很有效,即使textView不是第一响应者。

如果您不希望选择保持不变,则可以重置selectedRange:

代码语言:javascript
运行
复制
textView.selectedRange = NSMakeRange(0, 0);

...or保存当前选择并在以后恢复它

代码语言:javascript
运行
复制
NSRange oldRange = textView.selectedRange;
// do something
// then check if the range is still valid and
textView.selectedRange = oldRange;
票数 17
EN

Stack Overflow用户

发布于 2017-09-18 05:08:58

Andrew Schreiber的Swift 4简单复制/粘贴的答案

代码语言:javascript
运行
复制
extension NSRange {
    func toTextRange(textInput:UITextInput) -> UITextRange? {
        if let rangeStart = textInput.position(from: textInput.beginningOfDocument, offset: location),
            let rangeEnd = textInput.position(from: rangeStart, offset: length) {
            return textInput.textRange(from: rangeStart, to: rangeEnd)
        }
        return nil
    }
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9126709

复制
相关文章

相似问题

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