我在表格视图单元格中有这个可编辑的文本视图,maximumNumberOfLines
设置为4,lineBreakMode
设置为byClipping
。这非常符合预期,但似乎您可以键入文本视图的宽度,如下所示:
虽然字符不可见,但它们存储在某个地方,因为为了回到可见文本,删除尽可能多的键入边界是必要的。
我正在努力寻找这些不可见字符的独特之处,以便简单的deleteBackward()
在if语句中完成工作。这样,用户无法在物理上键入文本视图的边界。
我可以在textView:shouldChangeTextIn
中识别出这些不可见字符的内容,因此我deleteBackwards()
并使该类型无效?
答案 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
宽度比文本溢出时的所有其他前一行略宽。这与contentSize
和textView.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
}