我很清楚这个问题已被提出但我找不到合适的答案。 使用先前解决方案的组合我已经提出了这个代码:
- (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”条目的解决方案,但这不起作用,因为我们可以自然地到达新行而不按回复。
答案 0 :(得分:6)
我也遇到过这个问题。以前的解决方案都不适合我。这是我的解决方案,希望:(仅限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
答案 1 :(得分:5)
这个怎么样:
- (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;
}
解析新文本,然后使用textView的信息检查新文本的大小。
答案 2 :(得分:0)
这是我过去如何做到的,我希望它能为你提供一些帮助。
- (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;
让我知道这是否成功。