限制UITextview的行数

n.e*_*ind 67 iphone cocoa-touch uitextview

我想知道如何限制用户在编辑UITextField时可以输入的LINES(不是其他问题中提到的字符)的数量.

理想情况下,我想将输入限制为最大值.10行.

我需要从哪里开始?我是用方法做的吗?在

 - (BOOL)textViewShouldBeginEditing:(UITextView *)aTextView
Run Code Online (Sandbox Code Playgroud)

Jam*_*gas 214

Maciek Czarnik的回答对我不起作用,但它让我了解了该怎么做.

iOS 7+

迅速

textView.textContainer.maximumNumberOfLines = 10
textView.textContainer.lineBreakMode = .byTruncatingTail
Run Code Online (Sandbox Code Playgroud)

ObjC

textView.textContainer.maximumNumberOfLines = 10;
textView.textContainer.lineBreakMode = NSLineBreakByTruncatingTail;
Run Code Online (Sandbox Code Playgroud)

  • 这是错误的.它允许您在文本视图的末尾点击返回,然后光标消失,您必须再次点击删除才能找到它. (24认同)
  • 这应该是现在接受的答案,即使它已经晚了几年,它仍然有效! (3认同)

Mac*_*nik 52

也许这可以帮助(iOS 7+):

textView.textContainer.maximumNumberOfLines = 10;
[textView.layoutManager textContainerChangedGeometry:textView.textContainer];
Run Code Online (Sandbox Code Playgroud)

即使第一行应该做我猜的技巧,但不是......也许它是SDK中的一个错误


Ano*_*mie 15

你有正确的想法,但错误的方法.textView:shouldChangeTextInRange:replacementText:每当文本要改变时调用; 您可以使用其text属性访问文本视图的当前内容,并且可以使用传递的范围和替换文本构造新内容[textView.text stringByReplacingCharactersInRange:range withString:replacementText].然后,您可以计算行数并返回YES以允许更改,或者NO拒绝它.


Jon*_*BAB 12

即使在iOS7中,Maciek Czarnik的回答似乎也不适合我.它给了我奇怪的行为,我不知道为什么.

我如何限制UITextView中的行数简单地说:

(仅在iOS7中测试)在以下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];
    }
}
Run Code Online (Sandbox Code Playgroud)


lev*_*ese 11

Swift 3.0版本中:

self.textView.textContainer.maximumNumberOfLines = self.textViewNumberOflines
self.textView.textContainer.lineBreakMode = .byTruncatingTail
Run Code Online (Sandbox Code Playgroud)


fl0*_*034 6

这是Swift 4.2 / Swift 5中Numereyes答案的改进版本

我做了一些扩展,以便可以重用代码。我正在使用While-Loop检查尺寸是否合适。当用户一次粘贴很多文本时,这也适用。

extension UITextView {        
    var numberOfCurrentlyDisplayedLines: Int {
        let size = systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
        //for Swift <=4.0, replace with next line:
        //let size = systemLayoutSizeFitting(UILayoutFittingCompressedSize)

        return Int(((size.height - layoutMargins.top - layoutMargins.bottom) / font!.lineHeight))
    }

    /// Removes last characters until the given max. number of lines is reached
    func removeTextUntilSatisfying(maxNumberOfLines: Int) {
        while numberOfCurrentlyDisplayedLines > (maxNumberOfLines) {
            text = String(text.dropLast())
            layoutIfNeeded()
        }
    }
}

// Use it in UITextView's delegate method:
func textViewDidChange(_ textView: UITextView) {        
    textView.removeTextUntilSatisfying(maxNumberOfLines: 10)
}        
Run Code Online (Sandbox Code Playgroud)


Ben*_*bat 5

雨燕4

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
}
Run Code Online (Sandbox Code Playgroud)

如果您还想限制字符:

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
        if(text == "\n") {
            return linesAfterChange <= textView.textContainer.maximumNumberOfLines
        }

        let newText = (textView.text as NSString).replacingCharacters(in: range, with: text)
        let numberOfChars = newText.count
        return numberOfChars <= 30 // 30 characters limit
    }
}
Run Code Online (Sandbox Code Playgroud)

不要忘记添加您希望限制的行数viewDidLoad

txtView.textContainer.maximumNumberOfLines = 2
Run Code Online (Sandbox Code Playgroud)