限制UITextView内的行数

我很清楚这个问题已被问到,但我找不到一个有效的答案。 使用以前的解决scheme的组合我已经想出了这个代码:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)string { int numLines = notesTextView.contentSize.height / notesTextView.font.lineHeight; if (numLines <= 8) { return true; } return false; } 

这是行不通的,因为行数是在附加文本之前计算的,所以我们仍然超出了我们想要的行数,然后被困在上面,因为没有进一步的编辑是可能的。

我也尝试过检测“\ n”条目的解决scheme,但是这样做不起作用,因为我们可以在不按回车的情况下自然达到新的线条。

我也遇到过这个问题。 早期的解决scheme对我来说没有任何效果。 这是我的解决scheme,希望:(只有iOS 7+!)

 - (void)textViewDidChange:(UITextView *)textView { NSLayoutManager *layoutManager = [textView layoutManager]; NSUInteger numberOfLines, index, numberOfGlyphs = [layoutManager numberOfGlyphs]; NSRange lineRange; for (numberOfLines = 0, index = 0; index < numberOfGlyphs; numberOfLines++) { (void) [layoutManager lineFragmentRectForGlyphAtIndex:index effectiveRange:&lineRange]; index = NSMaxRange(lineRange); } if (numberOfLines > 3) { // roll back _labelField.text = _text; } else { // change accepted _text = _labelField.text; } } 

它使用NSString ivar _text在文本被改变后能够回滚。 这不会导致任何闪烁。

numberOfLines参考: https : //developer.apple.com/library/mac/documentation/cocoa/conceptual/TextLayout/Tasks/CountLines.html#//apple_ref/doc/uid/20001810-CJBGBIBB

这个怎么样:

 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)string { NSString *temp = [textView.text stringByReplacingCharactersInRange:range withString:string] CGSize size = [temp sizeWithFont:textView.font constrainedToSize:CGSizeMake(textView.frame.size.width,999) lineBreakMode:UILineBreakModeWordWrap]; int numLines = size.height / textView.font.lineHeight; if (numLines <= 8) { return true; } return false; } 

parsing新文本,然后使用textView的信息检查新文本的大小。

这是我过去如何做的,希望能给你提供一些帮助。

 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { // limit the number of lines in textview NSString* newText = [mytextView.text stringByReplacingCharactersInRange:range withString:text]; // pretend there's more vertical space to get that extra line to check on CGSize tallerSize = CGSizeMake(mytextView.frame.size.width-15, mytextView.frame.size.height*2); CGSize newSize = [newText sizeWithFont:mytextView.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap]; if (newSize.height > mytextView.frame.size.height) { NSLog(@"two lines are full"); return NO; } // dismiss keyboard and send comment if([text isEqualToString:@"\n"]) { [mytextView resignFirstResponder]; return NO; } return YES; } 

祝你好运。

编辑:

确定尝试下面的方法,看看这是否适合你。 只要将行数改为任何你想要的数字。

  (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if([text isEqualToString:@"n"]) { rows++; if(rows >= maxNumberOfLines){ //Exit textview return NO; } } return YES; 

让我知道这是否成功。