1

我在计算 UITextField 中显示的 NSString 的准确大小时遇到​​问题。

我的目标是以编程方式根据字符串大小更新文本字段框架大小(不使用sizeToFit)。我正在使用sizeWithFont函数。

-(void)resizeTextFieldAccordingToText:(NSString*)textFieldString {

    CGPoint originalCenter = self.textField.center;

    UIFont* currentFont = [textField font];
    CGSize newSize = [textFieldString sizeWithFont:currentFont];

    //Same incorrect results with the extended version of sizeWithFont, e.g.
    //[textFieldString sizeWithFont:currentFont constrainedToSize:CGSizeMake(300.0, 100.0) lineBreakMode:NSLineBreakByClipping];

    [self.textField setFrame:(CGRectMake(self.textField.frame.origin.x, self.textField.frame.origin.y, newSize.width, newSize.height))];
    [self.textField setCenter:originalCenter];

} 

问题:虽然这会返回正确的大小结果,但通过添加字符变得越来越不精确,因此最终开始剪切字符串(如右侧屏幕截图所示)。

在此处输入图像描述

如何获得 textField 字符串的准确大小以正确调整其大小?

4

2 回答 2

1

问题是您没有考虑 UITextField 的 contentInset。您的代码适用于标签而不适用于文本字段。

例如:一种方法可能是:

CGPoint originalCenter = self.textField.center;

UIFont* currentFont = [textField font];
CGSize oldSize = [self.textField.text sizeWithFont:currentFont];
CGSize newSize = [textFieldString sizeWithFont:currentFont];

CGRect finalFrame = self.textField.frame
finalFrame.size.width -= oldSize.width;
finalFrame.size.width += newSize.width;
finalFrame.size.height -= oldSize.height;
finalFrame.size.height += newSize.height;
[self.textField setFrame:finalFrame];

[self.textField setCenter:originalCenter];

ios7已弃用sizeWithFont:currentFont,所以它是sizeWithAttributes:@{NSFontAttributeName:currentFont}

于 2013-10-19T09:44:57.800 回答
1

如果你使用borderStyle != UITextBorderStyleNone,UITextField 有它自己的布局。在这种情况下,您必须将文本大小尺寸增加一些常数。

使用 UITextBorderStyleNone 你没有这个问题,下面的代码就像一个魅力(iOS 7 引入了获取文本大小的新方法,-sizeWithFont: 已弃用)

- (IBAction)textChanged:(UITextField *)field
{
    UIFont *font = field.font;
    NSString *string = field.text;

    CGSize size = [string sizeWithAttributes:
            [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName]];

    CGPoint center = field.center;
    CGRect frame = field.frame;
    frame.size = size; // or CGSizeMake(size.width + WIDTH_PADDING * 2, size.height + HEIGHT_PADDING * 2)
    field.frame = frame;
    field.center = center;
}
于 2013-10-19T09:52:40.527 回答