限制UITextView中的文本

时间:2009-01-04 17:59:42

标签: cocoa-touch

我试图将文本输入限制在cocoa-touch中的UITextView中。我真的想限制行数而不是字符数。到目前为止,我有这个来计算行数:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if([text isEqualToString:@"\n"]) {
        rows++;
    }
    NSLog(@"Rows: %i", rows);
    return YES;
}

但是,如果自动换行而不是用户按下返回键,则不起作用。有没有办法检查文本是否包装类似于检查“\ n”?

感谢。

1 个答案:

答案 0 :(得分:14)

不幸的是,使用NSString -stringWithFont:forWidth:lineBreakMode:不起作用 - 除了你选择的包装模式之外,文本包装的宽度小于当前宽度,并且高度在任何溢出行上变为0。为了得到一个真实的数字,将字符串放入一个比你需要的更高的框架 - 那么你将获得一个高于你的实际高度的高度。

注意我的软糖(从宽度减去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-15,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;
}