3

iOS 7 は新しい NSLinkAttribute をサポートしていますが、それを使用したくない場合は UITextView を使用する必要があります。私のアプリは、テーブルビューで 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