Ios 动态更改UILabel的字体大小
我目前有一个Ios 动态更改UILabel的字体大小,ios,objective-c,fonts,uilabel,Ios,Objective C,Fonts,Uilabel,我目前有一个ui标签: factLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 280, 100)]; factLabel.text = @"some text some text some text some text"; factLabel.backgroundColor = [UIColor clearColor]; factLabel.lineBreakMode = UILineBreakModeWordWrap; f
ui标签
:
factLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 280, 100)];
factLabel.text = @"some text some text some text some text";
factLabel.backgroundColor = [UIColor clearColor];
factLabel.lineBreakMode = UILineBreakModeWordWrap;
factLabel.numberOfLines = 10;
[self.view addSubview:factLabel];
在我的iOS应用程序的整个生命周期中,factLabel
获取一系列不同的值。有些是多句话,有些只有5到6个单词
如何设置ui标签
,使字体大小改变,使文本始终符合我定义的边界?单行:
上面的代码会将文本的字体大小调整为(例如)8
,以使文本适合标签。
numberOfLines=1
是必需的
多行:
对于numberOfLines>1
有一种通过方法计算最终文本大小的方法,例如:
CGSize lLabelSize = [yourText sizeWithFont:factLabel.font
forWidth:factLabel.frame.size.width
lineBreakMode:factLabel.lineBreakMode];
之后,您可以使用生成的lLabelSize
调整标签大小,例如(假设您只更改标签的高度):
iOS6
单线:
从iOS6开始,minimumFontSize
已被弃用。线路
factLabel.minimumFontSize = 8.;
可更改为:
factLabel.minimumScaleFactor = 8./factLabel.font.pointSize;
iOS7
多行:
从iOS7开始,sizeWithFont
不再推荐使用。
多行大小写减少为:
factLabel.numberOfLines = 0;
factLabel.lineBreakMode = NSLineBreakByWordWrapping;
CGSize maximumLabelSize = CGSizeMake(factLabel.frame.size.width, CGFLOAT_MAX);
CGSize expectSize = [factLabel sizeThatFits:maximumLabelSize];
factLabel.frame = CGRectMake(factLabel.frame.origin.x, factLabel.frame.origin.y, expectSize.width, expectSize.height);
iOS 13(Swift 5):
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.5
private func adapteSizeLabel(label: UILabel, sizeMax: CGFloat) {
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.ByWordWrapping
let maximumLabelSize = CGSizeMake(label.frame.size.width, sizeMax);
let expectSize = label.sizeThatFits(maximumLabelSize)
label.frame = CGRectMake(label.frame.origin.x, label.frame.origin.y, expectSize.width, expectSize.height)
}
只需将sizeToFit消息发送到UITextView即可。它将调整自己的高度,以刚好适合其文本。它不会更改自身的宽度或原点
[textViewA1 sizeToFit];
minimumFontSize
已被iOS 6弃用。您可以使用minimumScaleFactor
yourLabel.adjustsFontSizeToFitWidth=YES;
yourLabel.minimumScaleFactor=0.5;
这将根据标签和文本的宽度来调整字体大小。这有点不复杂,但应该可以, 例如,假设您希望将uilabel限制为120x120,最大字体大小为28:
magicLabel.numberOfLines = 0;
magicLabel.lineBreakMode = NSLineBreakByWordWrapping;
...
magicLabel.text = text;
for (int i = 28; i>3; i--) {
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:(CGFloat)i] constrainedToSize:CGSizeMake(120.0f, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
if (size.height < 120) {
magicLabel.font = [UIFont systemFontOfSize:(CGFloat)i];
break;
}
}
magicLabel.numberOfLines=0;
magicLabel.lineBreakMode=NSLineBreakByWordWrapping;
...
magicLabel.text=文本;
对于(int i=28;i>3;i--){
CGSize size=[text sizeWithFont:[UIFont systemFontOfSize:(CGFloat)i]约束大小:CGSizeMake(120.0f,CGFloat_MAX)lineBreakMode:NSLineBreakByWordWrapping];
如果(尺寸高度<120){
magicLabel.font=[UIFont-systemFontOfSize:(CGFloat)i];
打破
}
}
根据@Eyal Ben Dov的回答,您可能希望创建一个类别,以便在您的其他应用程序中灵活使用
Obs:我已经更新了他的代码,使其与iOS 7兼容
-头文件
#import <UIKit/UIKit.h>
@interface UILabel (DynamicFontSize)
-(void) adjustFontSizeToFillItsContents;
@end
#import "UILabel+DynamicFontSize.h"
@implementation UILabel (DynamicFontSize)
#define CATEGORY_DYNAMIC_FONT_SIZE_MAXIMUM_VALUE 35
#define CATEGORY_DYNAMIC_FONT_SIZE_MINIMUM_VALUE 3
-(void) adjustFontSizeToFillItsContents
{
NSString* text = self.text;
for (int i = CATEGORY_DYNAMIC_FONT_SIZE_MAXIMUM_VALUE; i>CATEGORY_DYNAMIC_FONT_SIZE_MINIMUM_VALUE; i--) {
UIFont *font = [UIFont fontWithName:self.font.fontName size:(CGFloat)i];
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: font}];
CGRect rectSize = [attributedText boundingRectWithSize:CGSizeMake(self.frame.size.width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin context:nil];
if (rectSize.size.height <= self.frame.size.height) {
self.font = [UIFont fontWithName:self.font.fontName size:(CGFloat)i];
break;
}
}
}
@end
#import "UILabel+DynamicFontSize.h"
[myUILabel adjustFontSizeToFillItsContents];
extension UILabel {
func fitFontForSize(var minFontSize : CGFloat = 5.0, var maxFontSize : CGFloat = 300.0, accuracy : CGFloat = 1.0) {
assert(maxFontSize > minFontSize)
layoutIfNeeded() // Can be removed at your own discretion
let constrainedSize = bounds.size
while maxFontSize - minFontSize > accuracy {
let midFontSize : CGFloat = ((minFontSize + maxFontSize) / 2)
font = font.fontWithSize(midFontSize)
sizeToFit()
let checkSize : CGSize = bounds.size
if checkSize.height < constrainedSize.height && checkSize.width < constrainedSize.width {
minFontSize = midFontSize
} else {
maxFontSize = midFontSize
}
}
font = font.fontWithSize(minFontSize)
sizeToFit()
layoutIfNeeded() // Can be removed at your own discretion
}
}
干杯Swift版本:
textLabel.adjustsFontSizeToFitWidth = true
textLabel.minimumScaleFactor = 0.5
现在是2015年。我不得不去找一篇博文,解释如何使用Swift在最新版本的iOS和XCode上实现这一点,以便它可以使用多行代码
这里是UILabel的快速扩展。它运行一个二进制搜索算法,根据标签边界的宽度和高度调整字体大小。经测试可与iOS 9和自动布局一起使用 用法:其中
是需要调整字体大小的预定义UILabel
<label>.fitFontForSize()
.fitFontForSize()
默认情况下,此函数在5pt和300pt字体大小范围内搜索,并将字体设置为在边界内“完全”匹配文本(精确到1.0pt)。您可以定义参数,例如,它可以在1pt和标签的当前字体大小之间进行搜索,精确搜索范围为0.1pt,搜索方式如下:
<label>.fitFontForSize(1.0, maxFontSize: <label>.font.pointSize, accuracy:0.1)
.fitFontForSize(1.0,maxFontSize:.font.pointSize,精度:0.1)
将以下代码复制/粘贴到您的文件中
#import <UIKit/UIKit.h>
@interface UILabel (DynamicFontSize)
-(void) adjustFontSizeToFillItsContents;
@end
#import "UILabel+DynamicFontSize.h"
@implementation UILabel (DynamicFontSize)
#define CATEGORY_DYNAMIC_FONT_SIZE_MAXIMUM_VALUE 35
#define CATEGORY_DYNAMIC_FONT_SIZE_MINIMUM_VALUE 3
-(void) adjustFontSizeToFillItsContents
{
NSString* text = self.text;
for (int i = CATEGORY_DYNAMIC_FONT_SIZE_MAXIMUM_VALUE; i>CATEGORY_DYNAMIC_FONT_SIZE_MINIMUM_VALUE; i--) {
UIFont *font = [UIFont fontWithName:self.font.fontName size:(CGFloat)i];
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: font}];
CGRect rectSize = [attributedText boundingRectWithSize:CGSizeMake(self.frame.size.width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin context:nil];
if (rectSize.size.height <= self.frame.size.height) {
self.font = [UIFont fontWithName:self.font.fontName size:(CGFloat)i];
break;
}
}
}
@end
#import "UILabel+DynamicFontSize.h"
[myUILabel adjustFontSizeToFillItsContents];
extension UILabel {
func fitFontForSize(var minFontSize : CGFloat = 5.0, var maxFontSize : CGFloat = 300.0, accuracy : CGFloat = 1.0) {
assert(maxFontSize > minFontSize)
layoutIfNeeded() // Can be removed at your own discretion
let constrainedSize = bounds.size
while maxFontSize - minFontSize > accuracy {
let midFontSize : CGFloat = ((minFontSize + maxFontSize) / 2)
font = font.fontWithSize(midFontSize)
sizeToFit()
let checkSize : CGSize = bounds.size
if checkSize.height < constrainedSize.height && checkSize.width < constrainedSize.width {
minFontSize = midFontSize
} else {
maxFontSize = midFontSize
}
}
font = font.fontWithSize(minFontSize)
sizeToFit()
layoutIfNeeded() // Can be removed at your own discretion
}
}
扩展UILabel{
func fitFontForSize(变量minFontSize:CGFloat=5.0,变量maxFontSize:CGFloat=300.0,精度:CGFloat=1.0){
断言(maxFontSize>minFontSize)
layoutifneedd()//可以自行删除
让constrainedSize=bounds.size
而maxFontSize-minFontSize>精度{
让midFontSize:CGFloat=((minFontSize+maxFontSize)/2)
font=font.fontWithSize(midFontSize)
sizeToFit()
让checkSize:CGSize=bounds.size
如果checkSize.height注意:每个
layoutifneed()
调用都可以自行删除Swift 2.0版本:
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.5
private func adapteSizeLabel(label: UILabel, sizeMax: CGFloat) {
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.ByWordWrapping
let maximumLabelSize = CGSizeMake(label.frame.size.width, sizeMax);
let expectSize = label.sizeThatFits(maximumLabelSize)
label.frame = CGRectMake(label.frame.origin.x, label.frame.origin.y, expectSize.width, expectSize.height)
}
此解决方案适用于多行: 在阅读了几篇文章之后,我需要一个能够自动缩放文本并将行数调整到给定标签大小内的最佳匹配的函数,我自己编写了一个函数。(即,一根短绳可以很好地固定在一行上,并使用大量的标签框,而一根长绳可以自动拆分为2或3行,并相应地调整大小) 您可以随意重复使用它,并根据需要进行调整。确保在
viewdilayoutsubviews
完成后调用它,以便设置初始标签框
+ (void)setFontForLabel:(UILabel *)label withMaximumFontSize:(float)maxFontSize andMaximumLines:(int)maxLines {
int numLines = 1;
float fontSize = maxFontSize;
CGSize textSize; // The size of the text
CGSize frameSize; // The size of the frame of the label
CGSize unrestrictedFrameSize; // The size the text would be if it were not restricted by the label height
CGRect originalLabelFrame = label.frame;
frameSize = label.frame.size;
textSize = [label.text sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize: fontSize]}];
// Work out the number of lines that will need to fit the text in snug
while (((textSize.width / numLines) / (textSize.height * numLines) > frameSize.width / frameSize.height) && (numLines < maxLines)) {
numLines++;
}
label.numberOfLines = numLines;
// Get the current text size
label.font = [UIFont systemFontOfSize:fontSize];
textSize = [label.text boundingRectWithSize:CGSizeMake(frameSize.width, CGFLOAT_MAX)
options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes:@{NSFontAttributeName : label.font}
context:nil].size;
// Adjust the frame size so that it can fit text on more lines
// so that we do not end up with truncated text
label.frame = CGRectMake(label.frame.origin.x, label.frame.origin.y, label.frame.size.width, label.frame.size.width);
// Get the size of the text as it would fit into the extended label size
unrestrictedFrameSize = [label textRectForBounds:CGRectMake(0, 0, label.bounds.size.width, CGFLOAT_MAX) limitedToNumberOfLines:numLines].size;
// Keep reducing the font size until it fits
while (textSize.width > unrestrictedFrameSize.width || textSize.height > frameSize.height) {
fontSize--;
label.font = [UIFont systemFontOfSize:fontSize];
textSize = [label.text boundingRectWithSize:CGSizeMake(frameSize.width, CGFLOAT_MAX)
options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes:@{NSFontAttributeName : label.font}
context:nil].size;
unrestrictedFrameSize = [label textRectForBounds:CGRectMake(0, 0, label.bounds.size.width, CGFLOAT_MAX) limitedToNumberOfLines:numLines].size;
}
// Set the label frame size back to original
label.frame = originalLabelFrame;
}
+(void)setFontForLabel:(UILabel*)标签,带有MaximumFontSize:(float)maxFontSize和MaximumLines:(int)maxLines{
int numLines=1;
float fontSize=maxFontSize;
CGSize textSize;//文本的大小
CGSize frameSize;//标签框架的大小
CGSize unrestrictedFrameSize;//如果文本不受标签高度限制,则文本的大小
CGRect originalLabelFrame=label.frame;
frameSize=label.frame.size;
textSize=[label.text size属性:@{NSFontAttributeName:[UIFont systemFo]