2012-03-28 77 views
82

我有这个奇怪的问题,并即时处理它现在超过8小时..根据情况我要计算动态UILabels大小,

UIViewController收到一个事件,我更改UILabels大小。从大到小。我的UILabel的尺寸越来越小,我得到了正确的所需尺寸,但我的UILabel中的文字保持不变,字体大小相同等。我需要字体变小,以使整个文字适合UILabel。所以问题是如何使文本适合我的标签autoshrinking或类似的东西?的UILabel不是自动缩小文本以适应标签尺寸

以我xibUILabelsautoshrink被检查,也线的数目被设置为0,并且也是我的串具有新行符号(\ n),并且我选择linebreakmodewordwrap。也许任何人都和我现在一样处于相同的境地,并可以帮助我?我真的很感激。

提前致谢!

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

+0

什么是你的字体的最小大小为你设置的请添加。 – AJPatel 2012-03-28 13:24:41

回答

134

如果你还在寻找一个更好的解决方案,我想这是你想要的:指示是否字体

一个布尔值应该减小大小以便将标题字符串放入标签的边界矩形中。(仅当numberOfLines属性被设置为1。此属性是有效)

@property(nonatomic) BOOL adjustsFontSizeToFitWidth 

布尔值,指示字母之间的间隔是否应当被调节,以适应标签的边界矩形内的字符串。

@property(nonatomic) BOOL adjustsLetterSpacingToFitWidth 

Source

+17

作为旁注,在iOS 6.0中不推荐使用'minimumFontSize'。改用'minimumScaleFactor'。 – lester 2012-10-16 20:25:20

+0

嗨,感谢您的帮助,但我已经尝试过,并没有帮助。看来,自动缩小不适用于多行。但我不明白为什么它是这样的.. – Lukas 2012-10-17 11:46:04

+11

是的自动缩小不适用于UILabel中的多行。 尝试想象一下:你有多行文本,你想缩小它,以便它适合宽度。那么它是否应该缩小整个文本以适合一行,或者文字保持在同一行并缩小以适合每个宽度?后者是最常见的情况,但不要忘记,这些词也可以用多行排列。即使文本的自动排列被禁用,您也不得不面对每行文本具有不同的字体大小,因为不是每个单词都适合宽度。 – lester 2012-10-18 13:28:35

1

这里是如何做到it.Suppose以下messageLabel是你想拥有所需effect.Now标签,尽量代码的这些简单的一行:

//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. 
+0

嘿感谢您的答案,但我不需要计算标签的高度,我有固定的大小,并根据我的字体必须变得更小,如果需要。 – Lukas 2012-03-28 14:08:45

2

我觉得你可以初始化页头后的标签写娄代码

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

它与我一起工作细使用它

+1

谢谢,但这不会计算或缩小字体到最低需要,因为我明白,以及为什么你的最小字体大于正常? – Lukas 2012-03-28 14:10:44

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

可以计算这样的

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 
[email protected]"HelloHelloHello"; 

希望行数这会帮助你:-) 等待你的答复

+0

因此,如果将行数设置为我的标签,文本会自动缩小呢? – Lukas 2012-03-29 05:40:25

+0

如果你的内容超出宽度,那么它将采取下一行 – Birju 2012-03-29 05:48:46

+0

嘿,我已经像你所建议的那样做,但它不起作用,为什么行数会帮助我? – Lukas 2012-03-29 06:01:02

1

如果numberOfLines > 1 我到底我没有找到我的答案也做出了类似的条件这 -

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

好不起作用。我认为自动收缩不适用于多行。我结束了在这个环节上使用建议: autoshrink on a UILabel with multiple lines

的解决方案是在给定的宽度calulate文字高度,如果文本比较大,缩小字体大小,然后做他一样了,直到高度等于或小于你的需要的大小。

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

53

minimumFontSize在IOS 6

已被弃用所以使用minimumScaleFactor代替minmimumFontSize

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

嘛弃用回答。解决了我的问题。谢谢 – 2014-09-08 05:33:45

+0

它适用于多行UILabel! – 2015-04-03 00:18:49

+1

@AntonMatosov,不,它不! – 2015-05-26 13:29:19

16

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

+3

只有当我从“Word Wrap”更改为“Clip”时,Autoshrink才能为我工作。 – NicJ 2015-04-14 02:29:24

+0

当我将换行换成剪辑时,我实际上能够在零行的标签中调整大小。如果有记录,男孩会很好。 – DesignatedNerd 2015-12-17 22:15:29

2

两年过去了,这个问题仍然存在...

在iOS系统中8/6.1的XCode,我有时发现我的UILabel(在UITableViewCell创建,用自动版式开启,灵活的约束等等它有足够的空间)不会调整自己以适应文本字符串。

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

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

(叹气)。

83

这是我得到的UILabel Autoshrink工作(尤其是标签字体的高度4S设备配件从6S加故事板)中的iOS 9.2时,Xcode 7.2 ...

enter image description here

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

这些是标签实际缩小所需的3种成分,我错过了剪辑换行符设置。另外,如果它与其他标签相邻(也可能会自动缩小),则需要设置压缩/拥抱优先级或给出明确的宽度或高度限制。这应该是目前接受的答案。 – 2015-12-31 20:15:53

+1

完成了所有这一切,但它仍然没有做到这一点。 – ninjaneer 2016-01-30 00:39:25

+0

行数为我做了!谢谢 – Michael 2016-06-01 15:37:34

2

在iOS中9我刚:

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

有人建议设置的行数为0,但对我来说这只是制作的标签去多行...

+0

这为我做了诡计。我刚刚在静态单元格中选择了“UILabel”和“UITextField”,并单击“解决AutoLayout问题”和“添加缺少约束”。一切排成一行,但Autoshrink需要知道与标签的距离,其中“添加缺少约束”未添加约束条件。 – Adrian 2016-10-21 01:49:50

0

即将迟到了,但因为我有一个附加要求每行字,这其中除了为我做的伎俩:

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

Apple Docs说:

通常,标签文本是使用您在font属性中指定的字体绘制的。但是,如果此属性设置为YES,并且文本属性中的文本超出了标签的边界矩形,接收器将开始缩小字体大小,直到字符串适合或达到最小字体大小。 在iOS 6中和前面,只有当numberOfLines属性被设置为1。

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

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

1

这是斯威夫特3运行的Xcode 8.2.1(8C1002)

,我已经找到了最好的解决办法是设置一个固定的宽度在标签上的故事板或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中工作。

2

I n Swift 3(以编程方式)我必须这样做:

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