4

我很清楚有人问过这个问题,但我找不到有效的答案。结合使用先前的解决方案,我提出了以下代码:

- (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”条目的解决方案,但这也不起作用,因为我们可以在不按回车的情况下自然地到达新行。

4

3 回答 3

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

于 2013-12-17T18:52:06.473 回答
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 的信息检查新文本的大小。

于 2013-06-18T15:04:04.773 回答
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;

让我知道这是否可行。

于 2013-06-18T15:05:07.297 回答