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

Luk*_*kas 113 iphone cocoa-touch objective-c ipad ios

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

在我的xib,UILabels autoshrink被检查,也行数被设置为0,并且也是我的串具有新行符号(\n),并且我选择linebreakmodewordwrap.也许有人和我现在处于同样的境地,可以帮助我吗?我真的很感激.

提前致谢!

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

les*_*ter 152

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

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

@property(nonatomic) BOOL adjustsFontSizeToFitWidth
Run Code Online (Sandbox Code Playgroud)

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

@property(nonatomic) BOOL adjustsLetterSpacingToFitWidth
Run Code Online (Sandbox Code Playgroud)

来源.

  • 作为旁注,在iOS 6.0中不推荐使用`minimumFontSize`.请改用"minimumScaleFactor". (18认同)
  • 是自动缩小对UILabel中的多行不起作用.试着想象一下:你有多行文字,你想缩小它以使它"适合"宽度.那么它应该缩小整个文本以适应一行,还是单词保持在同一行并收缩以适合每个宽度?后者是最常见的情况,但不要忘记单词也设置为多行排列.即使禁用了文本的自动排列,您也必须面对具有不同字体大小的文本的每一行,因为并非每个单词都适合宽度. (14认同)
  • @lester它应该缩小,以便在给定当前尺寸的标签声明的行数中可以看到整个文本.它不需要尝试使每一行具有不同的大小.我真的很惊讶它无法解决这个问题.因此,如果我有一个(可能)长的字符串要显示,我可以*有*多行或有自动大小,而不是两者.这是可爱的. (4认同)
  • 我认为这个答案[类别](http://stackoverflow.com/a/11694757/1751195)非常好,它甚至可能是你已经实现的.这绝对是Apple API中缺少的,或者他们只是看不到缩小应该是多行[静态文本]的常见用例(http://developer.apple.com/library/ios/#DOCUMENTATION/的UIKit /参考/ UILabel_Class /参考/ UILabel.html). (2认同)

ohh*_*hho 118

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

在此输入图像描述

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

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

小智 69

minimumFontSize 在iOS 6中已弃用.

所以用minimumScaleFactor而不是minmimumFontSize.

lbl.adjustsFontSizeToFitWidth = YES
lbl.minimumScaleFactor = 0.5
Run Code Online (Sandbox Code Playgroud)

  • 是的,它确实(现在) - 如果您还将换行符设置为Truncate Tail而不是Word Wrap ... (2认同)

小智 19

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

  • 只有当我从"Word Wrap"更改为"Clip"时,Autoshrink才能为我工作. (3认同)

Nal*_*ene 9

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

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


Bir*_*rju 5

你可以这样写

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];
Run Code Online (Sandbox Code Playgroud)

你可以计算这样的行数

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
Run Code Online (Sandbox Code Playgroud)
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";
Run Code Online (Sandbox Code Playgroud)

希望这会帮助你:-)等待你的回复