计算NSString大小以调整UITextField框架

时间:2013-10-19 09:28:56

标签: ios objective-c nsstring uitextfield

我在计算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];

} 

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

enter image description here

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

2 个答案:

答案 0 :(得分: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}

答案 1 :(得分: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;
}