限制UITextView中的行数

时间:2013-06-18 14:42:31

标签: ios objective-c uitextview

我很清楚这个问题已被提出但我找不到合适的答案。 使用先前解决方案的组合我已经提出了这个代码:

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

3 个答案:

答案 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;

让我知道这是否成功。