【问题标题】:Keeping User-Input UITextVIew Content Constrained to Its Own Frame将用户输入的 UITextVIew 内容限制在自己的框架内
【发布时间】: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;
}

【问题讨论】:

    标签: iphone objective-c cocoa-touch uitableview


    【解决方案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 会再次修复它,但会打破文本框限制。
    猜你喜欢
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 2017-09-21
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    相关资源
    最近更新 更多