限制UITextview的行数
我想知道如何限制用户在编辑UITextField时可以input的LINES的数量(不像其他问题中提到的那样)。
理想情况下,我想限制input到最大。 10行。
我需要从哪里开始? 我用这种方法做这个吗? 在
- (BOOL)textViewShouldBeginEditing:(UITextView *)aTextView
你有正确的想法,但方法错了。 textView:shouldChangeTextInRange:replacementText:
每当文本将要改变时被调用; 您可以使用其text
属性访问文本视图的当前内容,并且可以使用[textView.text stringByReplacingCharactersInRange:range withString:replacementText]
从传入的范围和replace文本构造新的内容。 然后,您可以计算行数,并返回YES以允许更改或NO拒绝它。
Maciek Czarnik的答案不适合我,但它让我知道该怎么做。
iOS 7+
textView.textContainer.maximumNumberOfLines = 10; textView.textContainer.lineBreakMode = NSLineBreakByTruncatingTail;
也许这可以帮助(iOS 7 +):
textView.textContainer.maximumNumberOfLines = 10; [textView.layoutManager textContainerChangedGeometry:textView.textContainer];
即使第一行应该做的伎俩,我猜,但不…可能是它在SDK中的错误
Maciek Czarnik的答案似乎不适用于我,即使在iOS7。 它给了我奇怪的行为,我不知道为什么。
我所做的限制UITextView中的行数很简单:
(仅在iOS7中testing)在以下UITextViewDelegate方法中:
- (void)textViewDidChange:(UITextView *)textView { NSUInteger maxNumberOfLines = 5; NSUInteger numLines = textView.contentSize.height/textView.font.lineHeight; if (numLines > maxNumberOfLines) { textView.text = [textView.text substringToIndex:textView.text.length - 1]; } }
在Swift 3.0
版本中:
self.textView.textContainer.maximumNumberOfLines = self.textViewNumberOflines self.textView.textContainer.lineBreakMode = .byTruncatingTail
给出的其他解决scheme不能解决最后创build的最后一行(问题的第11行)的问题。
这里是一个工作解决scheme与Swift 4.0
和Xcode 9.0testing版(在这篇博客文章中find)
class ViewController: UIViewController, UITextViewDelegate { @IBOutlet weak var textView: UITextView! override func viewDidLoad() { super.viewDidLoad() textView.delegate = self textView.textContainer.maximumNumberOfLines = 10 textView.textContainer.lineBreakMode = .byWordWrapping } func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { let existingLines = textView.text.components(separatedBy: CharacterSet.newlines) let newLines = text.components(separatedBy: CharacterSet.newlines) let linesAfterChange = existingLines.count + newLines.count - 1 return linesAfterChange <= textView.textContainer.maximumNumberOfLines }
注意:该解决scheme不处理最后一行太长而不能显示的场景(文本将隐藏在UITextView的最右侧)。