限制UITextView中的行数

Cal*_* Wu 5 objective-c uitextview ios ios5

有没有办法"准确"限制UITextView中针对目标iOS 5.0的行数?

我曾经尝试过的

因为我在堆栈溢出搜索.我在之前的链接中发现了这些问题.
在UITextView中,如何获得下一个输入将开始另一行的点
限制UITextview
的行数限制UITextView中的行数

但是UITextView当我试图决定是否返回YES或NO时,我仍然无法获得准确的行数textView:shouldChangeTextInRange:replacementText:.我曾尝试使用代码,它是UITextView限制文本的答案,修改后的代码(在答案中删除-15)如下所示.

- (BOOL)textView:(UITextView *)aTextView shouldChangeTextInRange:(NSRange)aRange replacementText:(NSString*)aText
{
        NSString* newText = [aTextView.text stringByReplacingCharactersInRange:aRange withString:aText];

        // TODO - find out why the size of the string is smaller than the actual width, so that you get extra, wrapped characters unless you take something off
        CGSize tallerSize = CGSizeMake(aTextView.frame.size.width,aTextView.frame.size.height*2); // pretend there's more vertical space to get that extra line to check on
        CGSize newSize = [newText sizeWithFont:aTextView.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];

        if (newSize.height > aTextView.frame.size.height)
            {
            [myAppDelegate beep];
            return NO;
            }
        else
            return YES;
}
Run Code Online (Sandbox Code Playgroud)

我也找到了获得线路数量的方法UITextView.方法是按contentSize属性计算textView.contenSize.height/font.lineHeight.这种方法可以获得准确的行数UITextView.但问题是contentSize进入textView:shouldChangeTextInRange:replacementText:并且textViewDidChange:是旧的contentSize.所以我仍然无法限制UITextView中的行数.

解决方案我用过

这是一种解决方法,但至少它是有效的.

步骤1

首先,您需要创建一个与原始UITextView完全相同的临时新UITextView,但将临时UITextView设置为隐藏在.xib文件中.在此示例代码中,我将临时UITextView命名为tempTextInputView

第2步

将新的引用插座添加到.h文件中
@property (retain, nonatomic) IBOutlet UITextView *tempTextInputView;// Use to calculate the number of lines in UITextView with new text

第3步

添加以下代码.

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
    NSString *newText = [textView.text stringByReplacingCharactersInRange:range withString:text];
    _tempTextInputView.text = newText;

    // Calcualte the number of lines with new text in temporary UITextView
    CGRect endRectWithNewText = [_tempTextInputView caretRectForPosition:_tempTextInputView.endOfDocument];
    CGRect beginRectWithNewText = [_tempTextInputView caretRectForPosition:_tempTextInputView.beginningOfDocument];
    float beginOriginY = beginRectWithNewText.origin.y;
    float endOriginY = endRectWithNewText.origin.y;
    int numberOfLines = (endOriginY - beginOriginY)/textView.font.lineHeight + 1;

    if (numberOfLines > maxLinesInTextView) {// Too many lines
        return NO;
    }else{// Number of lines  will not over the limit
        return YES;
    }
}  
Run Code Online (Sandbox Code Playgroud)

讨论

  1. maxLinesInTextView是一个int变量,表示您想要的最大行数.
  2. 我使用临时UITextView设置新文本是因为当我在原始UITextView中设置新文本时,我在输入ChuYin(注音)键盘时遇到了一些问题,这是一种繁体中文输入法.
  3. 我仍然使用textView:shouldChangeTextInRange:replacementText:但不是textViewDidChange:因为我在使用全局NSString修改之前缓存文本时遇到了一些问题,并将UITextView.text替换为该全局NSString textViewDidChange:.

n00*_*mer 0

正如我在此处的回答中提到的,我建议不要使用shouldChangeCharactersInRange:,因为它是在文本实际更改之前调用的。

使用textViewDidChangeMethod:更有意义,因为它是在文本实际更改后调用的。从那里您可以轻松决定下一步该做什么。