限制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的最右侧)。