UITextView 延迟属性字符串 Link SwiftUI
UITextView Delayed AttributedString Link SwiftUI
我有一个文本视图,看起来像这样:
class StudyText: UITextView, UITextViewDelegate {
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
print(URL)
return false
}
override var canBecomeFirstResponder: Bool {
return false
}
}
这是结构:
struct ClickableText: UIViewRepresentable {
@Binding var text: NSMutableAttributedString
func makeUIView(context: Context) -> StudyText {
let view = StudyText()
view.dataDetectorTypes = .all
view.isEditable = false
view.isSelectable = true
view.delegate = view
view.isUserInteractionEnabled = true
return view
}
func updateUIView(_ uiView: StudyText, context: Context) {
uiView.attributedText = text
}
}
我正在使用属性链接。
我尝试过的每个解决方案都不会使链接响应快速点击。立即地。在打印语句出现之前需要一点延迟。
我试过这个:
view.delaysContentTouches = false
我试过这个:
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(tappedTextView(tapGesture:)))
self.addGestureRecognizer(tapRecognizer)
@objc func tappedTextView(tapGesture: UIGestureRecognizer) {
let textView = tapGesture.view as! UITextView
let tapLocation = tapGesture.location(in: textView)
let textPosition = textView.closestPosition(to: tapLocation)
let attr = textView.textStyling(at: textPosition!, in: .forward)!
if let url: URL = attr[NSAttributedString.Key(rawValue: NSAttributedString.Key.link.rawValue)] as? URL {
print("clicking here: \(url)")
}
}
但其中 none 有效。它总是延迟响应
我该如何解决这个问题?
UITextView
响应单击手势(让您跟随 link)和双击手势(让您 select 文本)。在您点击 link 一次后,不清楚您是否已完成手势或是否即将进行第二次点击。只有在没有第二次点击的短暂延迟之后,才能确定您实际上在调用 textView(_:shouldInteractWith:in:interaction:)
时进行了一次点击。
不幸的是,没有标准方法可以让 UITextView
允许跟随 link 而不允许文本 selection。您或许能够搜索在视图上注册的手势识别器并找到负责识别双击的那个并禁用它,但这样做可能会产生意想不到的副作用。
我有一个文本视图,看起来像这样:
class StudyText: UITextView, UITextViewDelegate {
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
print(URL)
return false
}
override var canBecomeFirstResponder: Bool {
return false
}
}
这是结构:
struct ClickableText: UIViewRepresentable {
@Binding var text: NSMutableAttributedString
func makeUIView(context: Context) -> StudyText {
let view = StudyText()
view.dataDetectorTypes = .all
view.isEditable = false
view.isSelectable = true
view.delegate = view
view.isUserInteractionEnabled = true
return view
}
func updateUIView(_ uiView: StudyText, context: Context) {
uiView.attributedText = text
}
}
我正在使用属性链接。
我尝试过的每个解决方案都不会使链接响应快速点击。立即地。在打印语句出现之前需要一点延迟。
我试过这个:
view.delaysContentTouches = false
我试过这个:
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(tappedTextView(tapGesture:)))
self.addGestureRecognizer(tapRecognizer)
@objc func tappedTextView(tapGesture: UIGestureRecognizer) {
let textView = tapGesture.view as! UITextView
let tapLocation = tapGesture.location(in: textView)
let textPosition = textView.closestPosition(to: tapLocation)
let attr = textView.textStyling(at: textPosition!, in: .forward)!
if let url: URL = attr[NSAttributedString.Key(rawValue: NSAttributedString.Key.link.rawValue)] as? URL {
print("clicking here: \(url)")
}
}
但其中 none 有效。它总是延迟响应 我该如何解决这个问题?
UITextView
响应单击手势(让您跟随 link)和双击手势(让您 select 文本)。在您点击 link 一次后,不清楚您是否已完成手势或是否即将进行第二次点击。只有在没有第二次点击的短暂延迟之后,才能确定您实际上在调用 textView(_:shouldInteractWith:in:interaction:)
时进行了一次点击。
不幸的是,没有标准方法可以让 UITextView
允许跟随 link 而不允许文本 selection。您或许能够搜索在视图上注册的手势识别器并找到负责识别双击的那个并禁用它,但这样做可能会产生意想不到的副作用。