识别文本视图中不可见的字符

Posted

技术标签:

【中文标题】识别文本视图中不可见的字符【英文标题】:Recognize character not visible in text view 【发布时间】:2016-12-21 00:17:29 【问题描述】:

我在表格视图单元格中有这个可编辑的文本视图,maximumNumberOfLines 设置为 4,lineBreakMode 设置为 byClipping。这几乎可以按预期工作,但是您似乎可以输入超出文本视图的宽度,如下所示:

虽然字符不可见,但它们被存储在某处,因为为了恢复可见文本,有必要删除超出范围的输入内容。

我正在努力寻找这些隐形字符的独特之处,因此一个简单的deleteBackward() 可以在 if 语句中完成这项工作。这样,用户就不能在文本视图的边界之外进行物理输入。

我可以在textView:shouldChangeTextIn 中识别出这些不可见字符,所以我deleteBackwards() 并使类型无效?

【问题讨论】:

尝试将此处发布的解决方案转换为 swift:***.com/questions/21889657/… 【参考方案1】:

把它放在你的 UITextViewDelegate 中:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool 
    if text.isEmpty  // Always allow backspace
        return true
    
        let numLines: Int = Int(textView.contentSize.height/textView.font!.lineHeight);
        return numLines <= 4
    

最好将硬编码的 4 换成一个不错的常量或其他东西。

注意:这可能允许在“第五”行增加 1 个字符。为避免这种情况,您需要添加额外的代码来预测内容大小并做出相应的响应。

【讨论】:

谢谢,但这实际上不是我想要的。最大行数没有问题,因为表视图的maximumNumberOfLines 常量是较早设置的并且可以正常工作。问题在于水平方向的文本溢出,而不是垂直方向。 我已经做了一些测试并查看了其他关于 SO 的解决方案。这会将多余的字符限制为 1。其他解决方案将让您继续在屏幕外输入。如果UITextView 的实现没有被隐藏,解决起来会容易得多。【参考方案2】:

我发现文本溢出时文本视图的caretRect 宽度比文本溢出时的所有其他先前行稍宽。这与contentSizetextView.frame.size 不同,它们在字母溢出时不会改变。这使我能够识别溢出并删除有问题的字符。这是完整的实现:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool 

    let textRect = textView.caretRect(for: textView.endOfDocument)

    //Maximum length of a character is about 10
    if textView.contentSize.width - textRect.maxX < 10 

        // If user is already deleting, don't delete twice
        if text != "" 
            textView.deleteBackward() // return false works too
        
    

    return true

【讨论】:

以上是关于识别文本视图中不可见的字符的主要内容,如果未能解决你的问题,请参考以下文章

在点击识别器时识别表格单元格

识别脊的几何形状

识别点击并可以更改其文本/标签的视图的理想选择?

成为第一响应者后如何识别点击文本视图?

TapGestureRecognizer 在 UIView 子视图中不起作用

如何识别作为光学字符识别 (OCR) 输出的文本中的实体?