要求:判断点击的point在不在链接文字上,比如https://www.baidu.com,容易求出链接的
NSRange rangeOfString:
。
我的思路2种:
1、找到点击的point
所在的文字下标index
,与链接的字符长度linkRange
(容易求出rangeOfString
)进行比较,在其内就说明点击到了链接 NSLocationInRange(index, linkRange)
2、找出链接展示的位置linkFrameRange
,根据point
在不在linkFrameRange
内CGRectContainsPoint(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];
}
网友评论