将用户输入的 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 内容限制在自己的框架内的主要内容,如果未能解决你的问题,请参考以下文章

如何在ios中限制UITextView中的内容

Swift 4 或 Swift 5 中的 UITextView 用户输入文本验证:限制 Swift 中的特定字符

UITextView 的最大行数限制是多少

如何限制 MonoTouch 中的 UITextView 字符限制? [复制]

UITextView 限制输入字数

iOS UItextView监听输入特定字符跳转页面选择选项返回