gpt4 book ai didi

ios - 如何检测 UITextView 上特定行的点击?

转载 作者:行者123 更新时间:2023-11-30 12:27:39 35 4
gpt4 key购买 nike

我有一个 UITextview 我想制作几个单词作为链接,以便我可以检测对它们的点击并获取回调函数。我已将 UITextView 的链接属性设置为在委托(delegate)方法下进行检查和实现。

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
print("hello")
return true
}

@available(iOS 10.0, *)
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
print("bye")
return true
}

我还使用 NSMutableString 将字符串设为粗体和斜体

let str = NSMutableAttributedString(string: self.tvBottom.text as String, attributes: [NSFontAttributeName:UIFont.systemFont(ofSize: 17.0)])
str.addAttribute(NSLinkAttributeName, value: "http://www.google.com", range: NSRange(location: 4, length: 14))
str.addAttribute(NSForegroundColorAttributeName, value: UIColor.blue , range: NSRange(location: 4, length: 14))
let boldFontAttribute = [NSFontAttributeName: UIFont.boldSystemFont(ofSize: 17.0)]
str.addAttributes(boldFontAttribute, range: NSRange(location: 4, length: 14))
str.addAttribute(NSUnderlineStyleAttributeName , value: NSUnderlineStyle.styleSingle.rawValue, range: NSRange(location: 4, length: 14))
self.tvBottom.attributedText = str

我该怎么做?

最佳答案

要检测特定行上的点击(如您的问题标题所示),则以下代码可以完成这项工作:

func didTapTextView(recognizer: UITapGestureRecognizer) {
if recognizer.state == .recognized {
let location = recognizer.location(ofTouch: 0, in: textView)

if location.y >= 0 && location.y <= textView.contentSize.height {
guard let font = textView.font else {
return
}

let line = Int((location.y - textView.textContainerInset.top) / font.lineHeight) + 1
print("Line is \(line)")
}
}
}

下面的代码用于在我们的 textView 上检测到点击时调用上面的方法。

let tap = UITapGestureRecognizer(target: self, action: #selector(didTapTextView(recognizer:)))
tap.cancelsTouchesInView = false
textView.addGestureRecognizer(tap)

但是,如果您只想检测链接上的点击,那么您应该遵守 UITextViewDelegate 协议(protocol),并实现以下方法:

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
return true
}

当然,您需要将委托(delegate)添加到您的textView中(例如在viewDidLoad()中)

textView.delegate = self

附注您的 UITextView 不应该是可编辑的。

关于ios - 如何检测 UITextView 上特定行的点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43975678/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com