我最近不得不自己创建一个方法,这是我想出的这段代码
-(float)updateFontSize : (UITextField *)textField : (int)targetLabelWidth : (int)targetLabelHeight
{
//Current Label Size
CGSize size = [textField.text sizeWithFont:textField.font];
//Size label should be limited to
CGSize targetSize = CGSizeMake(targetLabelWidth , targetLabelHeight);
//Current FontSize
int fontSize = textField.font.pointSize;
if(size.height > targetSize.height)
{
while(size.height > targetSize.height)
{
//Create new font
UIFont *newFont = textField.font;
//Decrement font size
fontSize-=1;
//Set new font size
newFont = [newFont fontWithSize:fontSize];
//set new label size
size = [textField.text sizeWithFont:newFont];
}
}
if(size.height < targetSize.height)
{
while(size.height < targetSize.height)
{
//Create new font
UIFont *newFont = textField.font;
//Increment font size
fontSize+=1;
//Set new font size
newFont = [newFont fontWithSize:fontSize];
//set new label size
size = [textField.text sizeWithFont:newFont];
}
}
//Prevent fontsize ever being 0
if(fontSize == 0)
{
fontSize = 1;
}
return fontSize;
}
我做了一个快速课程只是为了测试它。你可以随意调整高度,它会相应地改变它的大小。
int height = 10;
UITextField *field = [[UITextField alloc] initWithFrame:CGRectMake(10, 50, 200, height)];
field.borderStyle = UITextBorderStyleRoundedRect;
field.textAlignment = NSTextAlignmentLeft;
field.text = @"testing";
float size = [self updateFontSize:field :200 :height];
field.font = [UIFont fontWithName:@"Arial" size:size];
[self.view addSubview:field];
编辑:更新
当我创建此代码时,它最初是在设置标签的宽度和高度时创建的,因此我可以调整标签的大小以使其适合容器。我很快重新适应了 TextField,但它应该可以正常工作
在调整它的大小之前,我必须弄清楚文本字段中包含的文本的当前宽度/高度。现在在我的方法中,我知道宽度和高度应该是多少,但是你想要这样的方法
所以我们有了一个新方法
-(float)getFontSizeToFit:(NSTextField*)aTextField theMultilineTextToFitIn:(NSString*)aString
{
}
好的,让我们开始吧。注意我不是在mac上,所以我正在做这个速记
所以你有一个包含这样的文本的文本字段
“你好,这是一些随机文本”
所以你打电话
CGSize size = [textField.text sizeWithFont:textField.font];
这会创建一个 size 对象,该对象在执行任何换行或类似操作之前包含文本的宽度和高度
假设文本的宽度和高度为 W = 200,H = 30,假设 textField 只有宽度 150,高度 50,我们需要将文本放入此处。所以我们有
Width = 200
Height = 30
textFieldWidth = 150
textFieldHeight = 50
我可以做到
NumberOfLines = Width /textFieldWidth .
如果这个值
高度 * NumberOfLines = NumberOfLinesNeeded
30 * 2 = 60
但是如果你看上面,textField 的高度只有 50。这意味着对象需要调整大小。所以让我们用上面的变量来运行这个方法
CGSize size = [textField.text sizeWithFont:textField.font];
这将创建大小对象 (200,30)
但是 TextField 本身只有 (150,60)
现在我们可以将文本样式换行,因此文本将被分成两行,但问题是文本高度会大于文本字段的高度。所以我们需要开始减小字体大小,直到两行文本的总高度小于60。
这是 while 循环的用武之地。从这里您可以使用 while 循环将文本的字体大小不断减小 1,然后执行上述计算,并一直这样做直到文本适合文本字段本身。
正如我之前提到的,我不在 Mac 上,所以我无法为您创建此方法。但希望使用我描述的上述逻辑,您应该能够自己创建类似的东西。
祝你好运,希望这会有所帮助!