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

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

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

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

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

【问题讨论】:

标签: swift xcode uitextview


【解决方案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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-26
    • 2015-04-02
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    相关资源
    最近更新 更多