题 UILabel不会自动缩小文本以适合标签大小


我有这个奇怪的问题,现在我处理它超过8小时..根据情况,我必须计算 UILabels 大小动态,
例如
我的 UIViewController 收到一个事件,我改变了 UILabels 尺寸。从大到小。我的大小 UILabel 变小,我得到正确的所需大小,但我的文本 UILabel 保持不变,相同的字体大小等。我需要字体变小,整个文本适合 UILabel。所以问题是如何使文本适合我的标签 autoshrinking 或类似的东西?

在我的 xibUILabels  autoshrink 也被检查了 行数 设置为0,我的字符串也有新的行符号(\ n),我已经选中了 linebreakmode 至 wordwrap。也许有人和我现在的情况相同,可以帮助我吗?我真的很感激。

提前致谢!

编辑:  UILabel 最小字体大小设置为10


94
2018-03-28 13:16


起源


你设置的标签字体的最小尺寸是多少请添加。 - AJPatel


答案:


如果您仍在寻找更好的解决方案,我想这就是您想要的:

一个布尔值,指示是否应缩小字体大小以使标题字符串适合标签的边界矩形。 (仅当numberOfLines属性设置为1时,此属性才有效。)

@property(nonatomic) BOOL adjustsFontSizeToFitWidth

一个布尔值,指示是否应调整字母之间的间距以适合标签边界矩形内的字符串。

@property(nonatomic) BOOL adjustsLetterSpacingToFitWidth

资源


141
2017-10-16 20:08



作为旁注, minimumFontSize 在iOS 6.0中已弃用。使用 minimumScaleFactor 代替。 - lester
是自动缩小对UILabel中的多行不起作用。试着想象一下:你有多行文字,你想缩小它以使它“适合”宽度。那么它应该缩小整个文本以适合一行,还是单词保持在同一行并缩小以适合每个宽度?后者是最常见的情况,但不要忘记单词也设置为多行排列。即使禁用了文本的自动排列,您也必须面对具有不同字体大小的文本的每一行,因为并非每个单词都适合宽度。 - lester
我认为这个答案有一个 类别 这里非常好,甚至可能是你实施的。这绝对是Apple API中缺少的东西,或者他们只是看不到缩小应该是多行的常见用例 静态文本。 - lester
是的,这是一个好点,但无论如何,我认为如果我将行数设置为0,那就是一个明确的声明,即可能有一行或多行。并且自动收缩可能会被我猜的行数确定。但无论如何,感谢清除事情。我以为我做错了什么。一个类别是一个好主意,我想我会在其他项目中这样做,我将需要这个。感谢你的帮助,祝你好运;) - Lukas
@lester它应该缩小,以便在给定当前尺寸的标签声明的行数中可以看到整个文本。它不需要尝试使每一行具有不同的大小。我真的很惊讶它无法解决这个问题。所以,如果我有一个(可能)长字符串可以显示 或 有多行或有自动大小,而不是两者。这是可爱的。 - devios1


这就是我获得UILabel的方式 Autoshrink iOS 9.2,Xcode 7.2中的工作(尤其是6s Plus Storyboard中4s设备中标签字体的高度)......

enter image description here

  • 行数为0
  • 换行符:剪辑
  • 自动收缩:最小字体比例0.25

93
2017-12-15 07:29



这些是标签实际缩小所需的3种成分,我错过了剪辑线断裂设置。此外,如果它与其他标签相邻(也可能自动缩小),则需要设置压缩/拥抱优先级或给出明确的宽度或高度约束。这应该是目前接受的答案。 - Korey Hinton
完成所有这一切,它仍然没有做到这一点。 - ninjaneer
行数为我做了!谢谢 - Michael
很酷,选择CLIP解决了我的问题。 - iDevAmit
我尝试在Xcode8中使用相同的选项,发现无法正常工作。如果有人有这个想法,请帮助我。 - Ganesh


minimumFontSize 在iOS 6中已弃用。

所以用 minimumScaleFactor 代替 minmimumFontSize

lbl.adjustsFontSizeToFitWidth=YES;
lbl.minimumScaleFactor=0.5;

55
2017-09-17 07:44



好的回答。解决了我的问题。谢谢 - Abdul Yasin
它适用于多线UILabel! - Anton Matosov
@AntonMatosov,不,它没有! - Iulian Onofrei
是的,它确实(现在) - 如果您还将换行符设置为Truncate Tail而不是Word Wrap ... - TheEye


我的解决方案是布尔标签.adjustsFontSizeToFitWidth = YES; 但。您必须在界面生成器中将Word Wrapping切换到“”。 然后自动收缩标签。这个非常重要。


18
2018-06-25 08:43



只有当我从“Word Wrap”更改为“Clip”时,Autoshrink才能为我工作。 - NicJ
当我将自动换行更改为剪辑时,我实际上能够将其调整为零行标签。男孩如果记录下来会很好。 - DesignatedNerd


你可以这样写

UILabel *reviews = [[UILabel alloc]initWithFrame:CGRectMake(14, 13,270,30)];//Set frame
reviews.numberOfLines=0;
reviews.textAlignment = UITextAlignmentLeft;
reviews.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:12];
reviews.textColor=[UIColor colorWithRed:0.0/255.0 green:0.0/255.0 blue:0.0/255.0 alpha:0.8]; 
reviews.backgroundColor=[UIColor clearColor];

你可以计算这样的行数

CGSize maxlblSize = CGSizeMake(270,9999);
CGSize totalSize = [reviews.text sizeWithFont:reviews.font 
              constrainedToSize:maxlblSize lineBreakMode:reviews.lineBreakMode];

CGRect newFrame =reviews.frame;
newFrame.size.height = totalSize.height;
reviews.frame = newFrame;

CGFloat reviewlblheight = totalSize.height;

int lines=reviewlblheight/12;//12 is the font size of label

UILabel *lbl=[[UILabel alloc]init];
lbl.frame=CGRectMake(140,220 , 100, 25);//set frame as your requirement
lbl.font=[UIFont fontWithName:@"Arial" size:20];
[lbl setAutoresizingMask:UIViewContentModeScaleAspectFill];
[lbl setLineBreakMode:UILineBreakModeClip];
lbl.adjustsFontSizeToFitWidth=YES;//This is main for shrinking font
lbl.text=@"HelloHelloHello";

希望对你有帮助 :-) 等待你的回复


5
2018-03-29 04:58



所以如果设置我的标签行数,那么文本会自动收缩吗? - Lukas
如果您的内容超出宽度,则需要下一行 - Birju
嘿,我已经像你建议的那样做了,但它不起作用,为什么行数会对我有帮助? - Lukas
你是对的我试过它没用,但我找到了解决方案,你喜欢我的下一个答案 - Birju
lbl.adjustsFontSizeToFitWidth = YES;为我工作! - Developer


最后我没有找到答案。我认为自动收缩不适用于多行。我最终在这个链接中使用了建议: 在具有多行的UILabel上自动收缩

解决方案是在给定宽度下调整文本高度,如果文本较大,则缩小字体大小然后再次相同,直到高度等于或小于所需大小。

我不明白为什么这应该如此难以实施。如果我错过了什么,欢迎大家纠正我:)


3
2017-08-08 09:34



根据其他答案,缺少的关键是你需要将Word Wrapping设置为“Clip”。这是违反直觉的,但这需要让UILabel以您想要的方式自动缩小。这适用于多行UILabel。 - Duncan Babbage


这是适用于运行Xcode 8.2.1(8C1002)的Swift 3

我发现的最佳解决方案是在标签上设置Storyboard或IB中的固定宽度。通过约束边距来设置约束。在viewDidLoad中添加以下代码行:

override func viewDidLoad() {
            super.viewDidLoad()

            label.numberOfLines = 1
            label.adjustsFontSizeToFitWidth = true
            label.minimumScaleFactor = 0.5
        }

label constraints to margin

fixed width label constraints to margin

attributes inspector

这就像一个魅力,它不会溢出到一个新的行,并缩小文本以适应标签的宽度,没有任何奇怪的问题,并在Swift 3中工作。


3
2018-03-05 14:13





在Swift 3(以编程方式)中,我必须这样做:

let lbl = UILabel()
lbl.numberOfLines = 0
lbl.lineBreakMode = .byClipping
lbl.adjustsFontSizeToFitWidth = true
lbl.minimumScaleFactor = 0.5
lbl.font = UIFont.systemFont(ofSize: 15)

3
2018-03-09 14:03





我想你可以编写下面的代码 在alloc init Label之后 

UILabel* lbl = [[UILabel alloc]initWithFrame:CGRectMake(0, 10, 280, 50)];
lbl.text = @"vbdsbfdshfisdhfidshufidhsufhdsf dhdsfhdksbf hfsdh fksdfidsf sdfhsd fhdsf sdhfh sdifsdkf ksdhfkds fhdsf dsfkdsfkjdhsfkjdhskfjhsdk fdhsf ";
[lbl setMinimumFontSize:8.0];
[lbl setNumberOfLines:0];
[lbl setFont:[UIFont systemFontOfSize:10.0]];
lbl.lineBreakMode = UILineBreakModeWordWrap;
lbl.backgroundColor = [UIColor redColor];
[lbl sizeToFit];
[self.view addSubview:lbl];

它正在与我合作使用它


2
2018-03-28 13:41



谢谢,但这不会计算或缩小字体到我所理解的最低需要,还有为什么你的最小字体大于正常? - Lukas