识别文本视图中不可见的字符
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
宽度比文本溢出时的所有其他先前行稍宽。这与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
【讨论】:
以上是关于识别文本视图中不可见的字符的主要内容,如果未能解决你的问题,请参考以下文章