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

时间:2016-12-21 00:17:29

标签: swift xcode uitextview

我在表格视图单元格中有这个可编辑的文本视图,maximumNumberOfLines设置为4,lineBreakMode设置为byClipping。这非常符合预期,但似乎您可以键入文本视图的宽度,如下所示:

Infinite typing

虽然字符不可见,但它们存储在某个地方,因为为了回到可见文本,删除尽可能多的键入边界是必要的。

我正在努力寻找这些不可见字符的独特之处,以便简单的deleteBackward()在if语句中完成工作。这样,用户无法在物理上键入文本视图的边界。

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

2 个答案:

答案 0 :(得分:0)

将它放在您的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个字符。为了避免这种情况,您需要添加额外的代码来预测内容大小,并做出相应的响应。

答案 1 :(得分:0)

我发现文本溢出时文本视图的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
}