iOS 7 支持新的 NSLinkAttribute,但如果你不想使用它,你必须使用 UITextView。我的应用在 tableview 中使用 UITextViews 来显示可以包含链接的帖子。
问题是 UITextView 是第一响应者,因此所有触摸都不会发送到 tableview 或 tableviewcell。所以我想看看命中点下是否有链接,如果没有,则将触摸发送到超级视图(单元格)。
我在 UITextView 子类中使用了以下代码,但它似乎在[self closestPositionToPoint:point]
.
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if (self.editable) {
return [super hitTest:point withEvent:event];
}
if (self.attributedText.length > 0 && CGRectContainsPoint(self.bounds, point)) {
UITextPosition *position = [self closestPositionToPoint:point];
UITextPosition *Pos1 = [self positionFromPosition:position offset:-1];
UITextPosition *Pos2 = [self positionFromPosition:position offset:1];
UITextRange *range = [self textRangeFromPosition:Pos1 toPosition:Pos2];
NSInteger startOffset = [self offsetFromPosition:self.beginningOfDocument toPosition:range.start];
NSInteger endOffset = [self offsetFromPosition:self.beginningOfDocument toPosition:range.end];
NSRange offsetRange = NSMakeRange(startOffset, endOffset - startOffset);
NSURL *url = nil;
if (offsetRange.location == NSNotFound) {
return self.superview;
}
if (offsetRange.location +offsetRange.length > self.attributedText.length) {
return self.superview;
}
@try {
NSAttributedString *substring = [self.attributedText attributedSubstringFromRange:offsetRange];
if ([substring length] > 0) {
url = [substring attribute:NSLinkAttributeName atIndex:0 effectiveRange:Nil];
}
}
@catch (NSException * e) {
}
if ([super hitTest:point withEvent:event] == self) {
if (url) {
return [super hitTest:point withEvent:event];
} else {
return self.superview;
}
} else {
return[super hitTest:point withEvent:event];
}
} else {
return [super hitTest:point withEvent:event];
}
}
有没有更好的方法来检测 UITextView 中的链接?或者我能做些什么来修复崩溃[self closestPositionToPoint:point]
?