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中的行数.
这是一种解决方法,但至少它是有效的.
首先,您需要创建一个与原始UITextView完全相同的临时新UITextView,但将临时UITextView设置为隐藏在.xib文件中.在此示例代码中,我将临时UITextView命名为tempTextInputView
将新的引用插座添加到.h文件中
@property (retain, nonatomic) IBOutlet UITextView *tempTextInputView;// Use to calculate the number of lines in UITextView with new text
添加以下代码.
- (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)
maxLinesInTextView是一个int变量,表示您想要的最大行数.textView:shouldChangeTextInRange:replacementText:但不是textViewDidChange:因为我在使用全局NSString修改之前缓存文本时遇到了一些问题,并将UITextView.text替换为该全局NSString textViewDidChange:.