是否有机会确定是否在 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 中点击了空白空间?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定何时点击背景区域?

使用 UIScrollview 滚动 UITextview

模仿 UITextView 的默认双击行为

是否有任何通用解决方案可以在屏幕上的键盘上方滚动 UITextView 和 UITextField

UITextview 光标移动到行尾

当uitextView处于焦点时如何隐藏键盘~~