Как обрабатывать нажатия на отдельные слова в UILabel, используя swift, когда атрибутивный текст содержит смайлики? - PullRequest
0 голосов
/ 25 августа 2018

В общем случае обнаружение касания в определенном диапазоне внутри 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 ?

не работает.

Есть идеи?

...