我想根据文本字段的高度更改Textfield的字体大小。
因为我的代码可以根据屏幕尺寸(屏幕分辨率)以及放入最低分辨率时调整界面大小。
文字有点削减,使其难以理解。
如何动态更改字体大小。文本字段具有固定的高度和宽度。
我是一个osx应用程序,所以我不能像iOS中那样使用字体大小调整
答案 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上,因此我无法为您创建此方法。但是希望使用我描述的上述逻辑,你应该能够自己创建类似的东西。
祝你好运,希望这会有所帮助!!