I find the concept of fiddling with the internal gesture recognizers a little scary, so tried to find another solution.
I've discovered that we can override point(inside:with:)
to effectively allow a "tap-through" when the user isn't touching down on text with a link inside it:
// Inside a UITextView subclass:
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
guard let pos = closestPosition(to: point) else { return false }
guard let range = tokenizer.rangeEnclosingPosition(pos, with: .character, inDirection: .layout(.left)) else { return false }
let startIndex = offset(from: beginningOfDocument, to: range.start)
return attributedText.attribute(.link, at: startIndex, effectiveRange: nil) != nil
}
This also means that if you have a UITextView
with a link inside a UITableViewCell
, tableView(didSelectRowAt:)
still gets called when tapping the non-linked portion of the text :)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…