将用户输入的 UITextVIew 内容限制在自己的框架内
Posted
技术标签:
【中文标题】将用户输入的 UITextVIew 内容限制在自己的框架内【英文标题】:Keeping User-Input UITextVIew Content Constrained to Its Own Frame 【发布时间】:2011-02-06 07:44:06 【问题描述】:尝试创建一个固定大小的大文本框。
这个问题和140个字符的约束问题很相似,但是不是在140个字符处停止输入,而是想在到达textView的frame的边缘时停止输入,而不是向下延伸到深渊。这是我为委托方法所拥有的。似乎总是有点偏离。有什么想法吗?
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
BOOL edgeBump = NO;
CGSize constraint = textView.frame.size;
CGSize size = [[textView.text stringByAppendingString:text] sizeWithFont:textView.font
constrainedToSize:constraint
lineBreakMode:UILineBreakModeWordWrap];
CGFloat height = size.height;
if (height > textView.frame.size.height)
edgeBump = YES;
if([text isEqualToString:@"\b"])
return YES;
else if(edgeBump)
NSLog(@"EDGEBUMP!");
return NO;
return YES;
编辑:根据 Max 在下面的建议,这里是有效的代码(但是请注意,自动更正和剪切在这里不起作用):
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
CGSize constraint = textView.frame.size;
NSString *whatWasThereBefore = textView.text;
textView.text = [textView.text stringByReplacingCharactersInRange:range withString:text];
if (textView.contentSize.height >= constraint.height)
textView.text = whatWasThereBefore;
return NO;
【问题讨论】:
【参考方案1】:我有类似的问题,并注意到 sizeWithFont 返回错误的大小。我改用yourTextView.contentSize
。因此,您可以添加字符,获取内容大小,然后如果内容大小大于最大值,则删除新添加的字符。
Edit2:已修复
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
UITextView* clone_tv = [[[UITextView alloc] initWithFrame: textView.frame] autorelease];
clone_tv.text = [textView.text stringByReplacingCharactersInRange:range withString:text];
return (clone_tv.contentSize.height <= textView.frame.size.height*2);
注意 clone_tv。我们实际上是在克隆文本视图中更改文本,而不是在真实视图中。在这种情况下,自动更正和剪切有效。但是,我建议您在视图控制器中创建一些名为 cloneTextView 的 ivar 并每次都使用它。这样做可以避免不必要的分配。
【讨论】:
完全愚蠢的问题,但我发现随着更多字符的添加,内容视图会不断增长,因此高度永远不会赶上。想法? 您应该始终从您的 (textView:shouldChangeTextInRange:) 返回 NO 并手动设置文本。如果高度 >= max_height ==> yourTextView.text = text_before_adding_new;还是我误解了你的问题? 等等,马克斯。自动更正似乎不起作用。想法? “自动更正似乎不起作用”是什么意思? self.notesTextField.autocorrectionType = UITextAutocorrectionTypeYes;似乎无法正常运行。这包括自动完成建议和双击空格键以插入句点并将下一个字母大写。我认为为 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 返回 NO 会禁用此功能,因为返回 YES 会再次修复它,但会打破文本框限制。以上是关于将用户输入的 UITextVIew 内容限制在自己的框架内的主要内容,如果未能解决你的问题,请参考以下文章
Swift 4 或 Swift 5 中的 UITextView 用户输入文本验证:限制 Swift 中的特定字符