【问题标题】:dynamically change font size of NSTextfield动态更改 NSTextfield 的字体大小
【发布时间】:2013-06-27 07:25:16
【问题描述】:

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

因为我的代码会根据屏幕尺寸(屏幕分辨率)以及何时设置最低分辨率来调整界面大小。

文字有点删减,无法阅读。

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

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

【问题讨论】:

  • 您说“我想根据我的文本字段的高度更改我的文本字段的字体大小。”您还说“文本字段具有固定的高度和宽度”。你想做什么还不清楚。
  • 我认为 OP 意味着会有几个不同的文本字段,每个字段都有不同的固定宽度/高度,因此希望为每个文本字段相应调整文本大小。我提供的答案应该是动态调整字体大小,希望有帮助!

标签: objective-c macos nstextfield nsfont


【解决方案1】:

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

-(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 上,所以我无法为您创建此方法。但希望使用我描述的上述逻辑,您应该能够自己创建类似的东西。

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

【讨论】:

  • 对不起,我不明白这段代码。首先,方法的声明似乎不正确(或者它是编写声明的特定方式?)。而且我不明白 currentLabelWidth 和 currentLabelHeight 是什么。哪个标签的宽度和高度?如果我很好地理解了这个问题,我们想要的是根据 texfield 的宽度和高度来调整字体大小。方法的参数应该只有 NSTextField 和我们想要放入 NSTextField 的字符串的 NSString 吗?如果您能澄清一下,我将不胜感激。
  • 我更新了那里的方法,为清楚起见重命名了变量。基本上,您传入您希望文本字段大小为的 targetWidth 和 targetHeight。从这 2 个变量创建一个 Size 对象。还根据要更新的 TextField 对象的文本的当前大小创建大小对象。然后它尝试更新文本字段的大小,这就是 while 循环所做的事情。回想起来,我意识到指定的用户是针对 mac 而不是 iphone,我的阅读不正确是不好的。不过更新代码很简单,可惜我不在mac atm上
  • 感谢您的回答,但如何获得目标宽度和高度?当我在 NSTextfield 中设置文本时,我不知道会得到多少行。我认为您应该通过 -(float)getFontSizeToFit:(NSTextField*)aTextField theMultilineTextToFitIn:(NSString*)aString 更改方法的名称如果您设法这样做,那将非常清楚,您会问我所有的朋友投票支持你的答案:)
  • 你可以通过做一些数学计算出一个TextField占用了多少行,我会在一分钟内更新我的帖子
  • 更新了我的答案。我希望它可以帮助您创建您所追求的方法。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多