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

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

在我的xibUILabels autoshrink被选中, 行数也被设置为0,并且我的string也有新的行符号(\ n),并且我已经select了linebreakmode转换wordwrap 。 也许任何人和我现在一样,可以帮助我吗? 我真的很感激。

提前致谢!

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

如果你还在寻找更好的解决scheme,我想这是你想要的:

一个布尔值,指示是否应该减小字体大小以便将标题string合并到标签的边界矩形中。 (只有在numberOfLines属性设置为1时,此属性才有效。)

 @property(nonatomic) BOOL adjustsFontSizeToFitWidth 

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

 @property(nonatomic) BOOL adjustsLetterSpacingToFitWidth 

来源 。

这是我如何得到UILabel Autoshrink工作(特别是标签字体在6s加上故事板4s装置的高度)在iOS 9.2,Xcode 7.2 …

在这里输入图像说明

  • 行数是0
  • 换行符:剪辑
  • Autoshrink:最小字体比例0.25

minimumFontSize在iOS 6中已弃用。

所以使用minimumScaleFactor而不是minmimumFontSize

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

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

你可以写

 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"; 

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

那么最后我没有find我的答案。 而且我认为autoshrink不适用于多行。 我结束了在这个链接中使用build议: 在多行UILabel autoshrink

解决scheme是在给定的宽度下计算文本高度,如果文本较大,则缩小字体大小,然后再重复,直到高度等于或小于所需的大小。

我不明白为什么这么难实施。 如果我失去了一些东西,欢迎大家纠正我:)

我认为你可以在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]; 

它正在与我合作使用它

两年了,这个问题还在…

在iOS 8 / XCode 6.1中,我有时会发现,我的UILabel (在UITableViewCell创build,AutoLayout打开,灵活的约束,所以它有足够的空间)不会调整自己以适应文本string。

与往年一样,解决scheme是设置文本, 然后调用sizeToFit

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { . . . cell.lblCreatedAt.text = [note getCreatedDateAsString]; [cell.lblCreatedAt sizeToFit]; } 

(叹。)

在iOS 9中,我只需要:

  1. 将标签的左侧和右侧约束添加到超级视图。
  2. 将换行符模式设置为在IB中裁剪。
  3. 在IB中将行数设置为1。

有人build议将行数设置为0,但对于我来说,这只是使标签去多行…

在Swift 3(编程)我不得不这样做:

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

下面是如何做到这一点。假设以下消息标签是你想要的效果的标签。现在,试试这些简单的代码行:

  //SET THE WIDTH CONSTRAINTS FOR LABEL. CGFloat constrainedWidth = 240.0f;//YOU CAN PUT YOUR DESIRED ONE,THE MAXIMUM WIDTH OF YOUR LABEL. //CALCULATE THE SPACE FOR THE TEXT SPECIFIED. CGSize sizeOfText=[yourText sizeWithFont:yourFont constrainedToSize:CGSizeMake(constrainedWidth, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap]; UILabel *messageLabel=[[UILabel alloc] initWithFrame:CGRectMake(20,20,constrainedWidth,sizeOfText.height)]; messageLabel.text=yourText; messageLabel.numberOfLines=0;//JUST TO SUPPORT MULTILINING. 

如果numberOfLines > 1不起作用我做了这样的条件 –

 if(lblRecLocation.text.length > 100) lblRecLocation.font = [UIFont fontWithName:@"app_font_name" size:10]; 

晚会迟到了,但是因为我有额外的要求,每行只有一个字,这个加法对我来说是个窍门:

label.numberOfLines = [labelString componentsSeparatedByString:@" "].count;

苹果文件说:

通常情况下,标签文本是用您在font属性中指定的字体绘制的。 但是,如果此属性设置为YES,并且text属性中的文本超过了标签的边界矩形,接收器将开始缩小字体大小,直到string适合或达到最小字体大小。 在iOS 6及更早版本中,只有当numberOfLines属性设置为1时,此属性才有效。

但这是一个谎言。 我告诉你一个谎言! 所有iOS版本都是如此。 具体来说,在UICollectionViewCell使用UILabel时,这是正确的, UICollectionViewCell的大小由运行时通过自定义布局(例如self.menuCollectionViewLayout.itemSize = size )dynamic调整的约束决定。

因此,当与前面的答案中提到的adjustsFontSizeToFitWidthminimumScaleFactor一起使用时,以编程方式设置基于字数的numberOfLines解决了自动收缩问题。 根据字数甚至字符数做类似的事情可能会产生一个“足够接近”的解决scheme。

这是Swift 3运行Xcode 8.2.1(8C1002)

我发现的最佳解决scheme是在标签上的Storyboard或IB中设置固定宽度。 用限制边距来设置你的约束。 在你的viewDidLoad中添加下面几行代码:

 override func viewDidLoad() { super.viewDidLoad() label.numberOfLines = 1 label.adjustsFontSizeToFitWidth = true label.minimumScaleFactor = 0.5 } 

标签对边距的限制

固定宽度标签对边距的限制

属性检查员

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