В общем случае обнаружение касания в определенном диапазоне внутри UILabel (или касание определенного слова) может быть легко решено с использованием следующего расширения:
extension UITapGestureRecognizer {
func didTapAttributedTextInLabel(label: UILabel, inRange targetRange: NSRange) -> Bool {
let storage = NSTextStorage(attributedString: label.attributedText!)
let layoutManager = NSLayoutManager()
storage.addLayoutManager(layoutManager)
let textContainer = NSTextContainer(size: label.frame.size)
layoutManager.addTextContainer(textContainer)
textContainer.lineFragmentPadding = 0.0
var glyphRange = NSRange()
layoutManager.characterRange(forGlyphRange: targetRange, actualGlyphRange: &glyphRange)
let glyphRect = layoutManager.boundingRect(forGlyphRange: glyphRange, in: textContainer)
let touchPoint = self.location(ofTouch: 0, in: label)
return glyphRect.contains(touchPoint)
}
}
Но это не работает, если в атрибутивном тексте содержатся смайлики. Например:
Lorem ipsum dolor TAP_HERE lorem ipsum
отлично работает, но:
Lorem ipsum dolor TAP_HERE lorem ipsum ?
не работает.
Есть идеи?