我想根据我的文本字段的高度更改我的文本字段的字体大小。
因为我的代码可以根据屏幕尺寸(屏幕分辨率)以及何时输入最低分辨率来调整界面大小。
文本有点剪裁,使其无法阅读。
如何动态更改字体大小。文本字段具有固定的高度和宽度。
我是 osx 应用程序,所以我不能像在 iOS 中那样使用字体大小调整
我想根据我的文本字段的高度更改我的文本字段的字体大小。
因为我的代码可以根据屏幕尺寸(屏幕分辨率)以及何时输入最低分辨率来调整界面大小。
文本有点剪裁,使其无法阅读。
如何动态更改字体大小。文本字段具有固定的高度和宽度。
我是 osx 应用程序,所以我不能像在 iOS 中那样使用字体大小调整
我最近不得不自己创建一个方法,这是我想出的代码
-(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 .
如果此值 < 1,那么我知道文本将适合 textField,但是如果它大于 1,那么我知道它将不适合 textField,因此需要调整大小。在上面的示例中,它将是 200/150 = 1.333。我总是把这个值向上,所以我会把它四舍五入到 2。所以我知道我至少需要 2 行才能将这个标签放入容器中。我知道上面例子中标签的高度是 30,所以我知道
高度 * NumberOfLines = NumberOfLinesNeeded 30 * 2 = 60
但是如果你看上面,textField 的高度只有 50。这意味着对象需要调整大小。所以让我们用上面的变量来运行这个方法
CGSize size = [textField.text sizeWithFont:textField.font];
这将创建大小对象 (200,30)
但是 TextField 本身只有 (150,60)
现在我们可以将文本样式设置为自动换行,因此文本将被分成 2 行,但问题是文本高度会大于 textField 的高度。所以我们需要开始减小字体大小,直到 2 行文本的总高度小于 60。
这就是 while 循环的用武之地。从这里您可以使用 while 循环将文本的字体大小不断减小 1,然后执行上述计算,并继续执行此操作,直到文本适合文本字段本身。
正如我之前提到的,我不在 Mac 上,所以我无法为您创建此方法。但希望使用我描述的上述逻辑,您应该能够自己创建类似的东西。
祝你好运,希望这会有帮助!!