iOS/swift : Add UITapGestureRecognizer to NSMutableAttributedString

标签 ios swift nsattributedstring uitapgesturerecognizer

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

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

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

最佳答案

首先,无法将手势识别器添加到 NSMutableAttributedString,因为属性字符串对其在屏幕中的位置或用户触摸一无所知。

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

阅读该教程后,您应该知道无需向属性字符串添加点击手势识别器即可获得所需内容。如果您不需要 UITextView 可编辑,解决方案是将蓝色 More... 视为链接并附加自定义操作以在用户触摸它。这是 this link 中 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
      }
   }
}

关于iOS/swift : Add UITapGestureRecognizer to NSMutableAttributedString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45044003/

相关文章:

ios - 代码 8 : 'objc_unretainedPointer' is unavailable use a __bridge cast instead

ios - 将文本作为字符串共享给另一个应用程序

ios - 加载 .txt 文件的最佳方式?

iOS 9 和 Siri 的智能提醒

swift - 无法使用 MLDataTable 访问 .csv 数据

ios - swift 将个人的名字从 firebase 读入 UILabel

ios - NSAttributedString 中的 HTML 呈现速度非常慢

ios - 如何从 NSAttributed 字符串中分离属性并将这些属性应用于其他字符串?

swift - UITextView linkTextAttributes 字体属性不适用于 NSAttributedString

ios - 使用iOS Facebook SDK 3.1在墙上张贴