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]
ですか?