我在计算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字符串的准确大小以正确调整其大小?
答案 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;
}