1

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

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

文本有点剪裁,使其无法阅读。

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

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

4

1 回答 1

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 . 

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

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

于 2013-06-27T07:43:16.657 回答