问题
有没有一种方法在目标iOS 5.0中“准确地”限制UITextView的行数?
我尝试了什么
我在Stack Overflow上搜索后发现以下链接中曾经问过这些问题:
在UITextView中,如何获取下一个输入将开始另一行的点
限制UITextview的行数
限制UITextView的行数
但是在textView:shouldChangeTextInRange:replacementText:
中尝试决定是否返回YES或NO时,我仍然无法获得UITextView中准确的行数。
我尝试使用的代码是限制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;
}
我找到了一种方法来获取
UITextView
中文本的行数。这种方法是通过contentSize
属性计算,如下所示:textView.contenSize.height/font.lineHeight
。这个方法可以准确地得到UITextView
中的行数。但是问题在于,在textView:shouldChangeTextInRange:replacementText:
和textViewDidChange:
方法中获取的contentSize
是旧的contentSize
。因此,我仍然无法限制UITextView
中的行数。
我使用的解决方案
这是一种变通方法,但至少它能够工作。
步骤 1
首先,您需要创建一个临时的新UITextView
,其设置与原始UITextView
完全相同,但将临时UITextView
隐藏在.xib文件中。在这个示例代码中,我将临时UITextView
命名为tempTextInputView
。
步骤 2
在.h文件中添加新的引用输出,如下所示:@property (retain, nonatomic) IBOutlet UITextView *tempTextInputView;//用于计算带有新文本的UITextView的行数
步骤 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;
}
}
讨论
maxLinesInTextView
是一个代表你想要的最大行数的int
变量。- 我使用了一个临时的UITextView来设置新文本,因为当我在注音键盘上输入时(这是一种繁体中文输入法),如果直接在原始UITextView中设置新文本,我会遇到一些问题。
- 我仍然使用
textView:shouldChangeTextInRange:replacementText:
而不是textViewDidChange:
,是因为当我在全局NSString中缓存修改前的文本并将UITextView.text替换为该全局NSString时,在textViewDidChange:
中会出现一些问题。