3

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]

4

0 回答 0