动态更改NSTextfield的字体大小

时间:2013-06-27 07:25:17

标签: objective-c macos nstextfield nsfont

我想根据文本字段的高度更改Textfield的字体大小。

因为我的代码可以根据屏幕尺寸(屏幕分辨率)以及放入最低分辨率时调整界面大小。

文字有点削减,使其难以理解。

如何动态更改字体大小。文本字段具有固定的高度和宽度。

我是一个osx应用程序,所以我不能像iOS中那样使用字体大小调整

1 个答案:

答案 0 :(得分:2)

我最近不得不自己创建一个方法,这是我提出的代码

-(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 . 

如果此值为&lt; 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上,因此我无法为您创建此方法。但是希望使用我描述的上述逻辑,你应该能够自己创建类似的东西。

祝你好运,希望这会有所帮助!!