判断点击的point坐标在不在某段文字上

判断点击的point坐标在不在某段文字上_第1张图片
实例图

要求:判断点击的point在不在链接文字上,比如 https://www.baidu.com,容易求出链接的 NSRange rangeOfString:

我的思路2种:
1、找到点击的point所在的文字下标index,与链接的字符长度linkRange(容易求出rangeOfString)进行比较,在其内就说明点击到了链接 NSLocationInRange(index, linkRange)

2、找出链接展示的位置linkFrameRange,根据point在不在linkFrameRangeCGRectContainsPoint(linkFrameRange, point)

思路1需要先找到point所在的文字,再求出下标,不容易找,所以选择了第二中思路。

// 获得链接所在的rect     NSRange 转 UITextRange
UITextPosition *beginning = self.contentLbl.beginningOfDocument;
UITextPosition *start = [self.contentLbl positionFromPosition:beginning offset:linkRange.location];
UITextPosition *end = [self.contentLbl positionFromPosition:start offset:link_range.length];
UITextRange *textRange = [self.contentLbl textRangeFromPosition:start toPosition:end];

//判断下标是否在连接的范围,如果是,证明点击的该链接
if (CGRectContainsPoint(linkRect, point)){
       if (resultBlock) {
            resultBlock(link.linkStr,link.range,(NSInteger)j);
        }
            return YES;
     }

但是:经过验证,当一个链接是大于一行显示的时候,点击底部的point Y是不在链接的Rect内的,所以,放弃这个方法。下面这个方法更加准确:参数range是指 linkRange = [@"xxxxx" rangeOfString:linkStr]

- (CGRect)boundingRectForCharacterRange:(NSRange)range{
    NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:[self.contentLbl attributedText]];
    NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
    [textStorage addLayoutManager:layoutManager];
    
    NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:[self bounds].size];
    textContainer.lineFragmentPadding=0;
    [layoutManager addTextContainer:textContainer];
    
    NSRange glyphRange;
    [layoutManager characterRangeForGlyphRange:range actualGlyphRange:&glyphRange];
    
    return [layoutManager boundingRectForGlyphRange:glyphRange inTextContainer:textContainer];
    
}

你可能感兴趣的:(判断点击的point坐标在不在某段文字上)