繁体   English   中英

动态更改NSTextfield的字体大小

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM