[英]dynamically change font size of NSTextfield
我想根据我的文本框的高度更改我的文本框的字体大小。
因为我有根据屏幕尺寸(屏幕分辨率)以及输入最低分辨率时调整界面大小的代码。
文本有点删节,使其无法阅读。
如何动态更改字体大小。 文本字段的高度和宽度固定。
我适用于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];
这将创建一个大小对象,该对象在执行任何换行符或类似操作之前包含文本的宽度和高度
因此,假设文本的宽度和高度为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 =需要NumberOfLines 30 * 2 = 60
但是,如果从上方看,textField的高度仅为50。这意味着需要调整对象的大小。 因此,让我们使用上述变量遍历该方法
CGSize size = [textField.text sizeWithFont:textField.font];
这将创建大小对象(200,30)
但是,TextField本身仅为(150,60)
现在我们可以将文本样式进行自动换行,因此文本将被分成两行,但是问题是文本高度将大于textField的高度。 因此,我们需要开始减小字体大小,直到两行文本的组合高度小于60。
这是while循环进入的地方。从这里开始,您可以使用while循环将文本的字体大小连续减小1,然后执行上述计算,并继续进行操作,直到文本适合文本字段本身为止。
如前所述,我不在Mac上,因此无法为您创建此方法。 但是希望使用上述逻辑,您应该可以自己创建类似的东西。
祝你好运,希望这会有帮助!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.