是否有机会确定是否在 UITextView 中点击了空白空间?
Posted
技术标签:
【中文标题】是否有机会确定是否在 UITextView 中点击了空白空间?【英文标题】:is there any chance to identify if empty space has been tapped in UITextView? 【发布时间】:2020-08-12 18:21:17 【问题描述】:我在只读模式下使用 UITextView + Gesture Recognizer 使其可编辑以支持 URL,它工作得很好,但我遇到了这个问题: 当用户在文本中只有 URL 并点击其下方的空白区域以使 UITextView 可编辑时 - URL 被点击,用户被重定向到 URL。
预期行为:文本应变为可编辑。
由于以下代码导致问题发生:
extension TextViewController : UIGestureRecognizerDelegate
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool
if let textView = textView, textView.text.count > 0
var location = touch.location(in: textView)
location.x -= textView.textContainerInset.left
location.y -= textView.textContainerInset.top
let characterIndex = textView.layoutManager.characterIndex(for: location, in: textView.textContainer, fractionOfDistanceBetweenInsertionPoints: nil)
if (textView.attributedText?.attribute(.link, at: characterIndex, effectiveRange: nil) as? URL) != nil
return false
return true
具体由于“textView.layoutManager.characterIndex(for: location, in: textView.textContainer, fractionOfDistanceBetweenInsertionPoints: nil)”
它根据文档返回最后一个数字:
如果点下没有字符,则返回最近的字符
所以代码的行为就像 URL 已被点击一样,我看不到任何选项来检查是否已点击了空白区域。 这个想法是检查被点击的位置是否没有 URL,然后手势识别器应该收到点击(在此处返回 true) 如果您有任何想法,请提出建议
谢谢!
【问题讨论】:
【参考方案1】:好的,所以我让它按预期工作。解决方法是检查点击的位置是否是文档的结尾:
if let position = textView.closestPosition(to: location)
if position == textView.endOfDocument
return true
最终代码如下:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool
if let textView = textView, textView.text.count > 0
var location = touch.location(in: textView)
location.x -= textView.textContainerInset.left
location.y -= textView.textContainerInset.top
if let position = textView.closestPosition(to: location)
if position == textView.endOfDocument
return true
let characterIndex = textView.layoutManager.characterIndex(for: location, in: textView.textContainer, fractionOfDistanceBetweenInsertionPoints: nil)
if (textView.attributedText?.attribute(.link, at: characterIndex, effectiveRange: nil) as? URL) != nil
return false
return true
【讨论】:
以上是关于是否有机会确定是否在 UITextView 中点击了空白空间?的主要内容,如果未能解决你的问题,请参考以下文章