- создайте новый NSAttributedStringKey, который вы будете использовать для идентификации вложения изображения.
- Затем создайте NSTextAttachment с изображением, оберните его в NSMutableAttributedString и добавьте в него пользовательский атрибут.
Наконец добавьте обертку к полной NSAttributedString и присоедините UITapGestureRecognizer.
Затем, когда в селекторе в UITapGestureRecognizer просто ищите этот пользовательский тег.
Код для самого бита:
extension NSAttributedStringKey {
static let imagePath = NSAttributedStringKey(rawValue: "imagePath")
}
, когда нужно настроить отображение текста
let fullString = NSMutableAttributedString()
let imageAttachment = NSTextAttachment()
imageAttachment.image = image
let imageAttributedString: NSMutableAttributedString = NSAttributedString(attachment: imageAttachment).mutableCopy() as! NSMutableAttributedString
let customAttribute = [ NSAttributedStringKey.imagePath: imagePath ]
imageAttributedString.addAttributes(customAttribute, range: NSRange(location: 0, length: imageAttributedString.length))
fullString.append(imageAttributedString)
, затем в функции, вызываемой действием касания:
@objc func onImageTap(_ sender: UITapGestureRecognizer) {
let textView = sender.view as! UITextView
let layoutManager = textView.layoutManager
// location of tap in textView coordinates
var location = sender.location(in: textView)
location.x -= textView.textContainerInset.left;
location.y -= textView.textContainerInset.top;
// character index at tap location
let characterIndex = layoutManager.characterIndex(for: location, in: textView.textContainer, fractionOfDistanceBetweenInsertionPoints: nil)
// if index is valid
if characterIndex < textView.textStorage.length {
// check if the tap location has the custom attribute
let attributeValue = textView.attributedText.attribute(NSAttributedStringKey.imagePath, at: characterIndex, effectiveRange: nil) as? String
if let value = attributeValue {
print("You tapped on \(NSAttributedStringKey.imagePath) and the value is: \(value)")
}
}
}
Оттуда вы знаете, что на изображении был отвод, и у вас есть координаты внутри рамки изображения, так что вы можете использовать эту комбинацию, чтобы выяснить, где на снимке постучали.