Распознать касание изображения в атрибутивной строке, отображаемой в метке - PullRequest
1 голос
/ 28 января 2020

У меня есть указанная ниже строка, которая будет отображаться в метке.

let someText = NSMutableAttributedString(string: "This is a sample text with")
let imageAttachment = NSTextAttachment()
imageAttachment.image = UIImage(named: "icon") 

let imageString = NSAttributedString(attachment: imageAttachment)
someText.append(imageString)
someText.append(NSAttributedString(string: "attached")
somelabel.attributedText = someText

Метка отображает This is a sample text with 'image' attached

Как распознать нажатие на изображение (а не на текст) выполнить действие?

1 Ответ

1 голос
/ 28 января 2020
  • создайте новый 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)")
        }

    }

}

Оттуда вы знаете, что на изображении был отвод, и у вас есть координаты внутри рамки изображения, так что вы можете использовать эту комбинацию, чтобы выяснить, где на снимке постучали.

...