iOS/Swift:将 UITapGestureRecognizer 添加到 NSMutableAttributedString

jsh*_*py8 1 nsattributedstring ios uitapgesturerecognizer swift

我想知道是否可以将 a 添加UITapGestureRecognizerNSMutableAttributedString.

我想要做的是在字符限制的最后一个单词之后有一个“更多...”对象UITextView。为了使对象在最后一个单词之后立即出现,似乎最好使UITextView接受属性文本(而不是纯文本),然后附加类型为 的蓝色“更多...” NSMutableAttributedString

我见过人们通过将点击手势添加到封闭的来实现此目的的示例UITextView,但这还不够,因为我希望只有当他们点击属性字符串末尾的“更多...”时才会发生操作文本视图。我想看看是否有一种方法可以将点击手势直接添加到属性字符串中。

Rey*_*lar 6

首先,无法向 a 添加手势识别器,NSMutableAttributedString因为属性字符串不知道其在屏幕中的位置或用户触摸。

获取 a 中绘制的属性字符串的过程UITextView主要由三个类控制:NSTextStorageNSTextContainerNSLayoutManager。如果您想更多地了解它们的工作原理,请查看这个很棒的教程

阅读该教程后,您应该知道您不需要将点击手势识别器添加到属性字符串来获得您想要的内容。如果您不需要可UITextView编辑,解决方案是将蓝色视为More...链接并附加自定义操作以在用户触摸它时做出响应。以下是此链接中 Objective-C 代码的 Swift 翻译,以说明如何实现这一目标:

class ViewController: UIViewController, UITextViewDelegate {
    @IBOutlet weak var textView: UITextView!

   override func viewDidLoad() {
      super.viewDidLoad()
      let str = NSMutableAttributedString(
          string: "This is a sample text that is very long but you can see it completely because More..."
      )
      str.addAttribute(
         NSLinkAttributeName,
         value: "more://",
         range: (str.string as NSString).range(of: "More...")
      )
  
      textView.attributedText = str
      textView.delegate = self
      textView.isSelectable = true
      textView.isEditable = false
   }

   func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
      if URL.scheme == "more" {
         print("TODO: Handle more action here")
         return false
      }
      else {
         return true
      }
   }
}
Run Code Online (Sandbox Code Playgroud)