UILabel截断文本不起作用

时间:2012-12-10 04:03:24

标签: objective-c ios uilabel

我在IB中将numberOfLines设置为1,但是当我将文本设置为长字符串时,它不会截断。如果我将numberOfLines设置为2,则truncate工作正常。我该怎么做才能将长字符串截断为一行?

9 个答案:

答案 0 :(得分:6)

简单,设置以下属性:

label.adjustsFontSizeToFitWidth = NO;
label.lineBreakMode = NSLineBreakByTruncatingTail;

答案 1 :(得分:4)

如果使用自动布局,在我的情况下,缺少约束。如果没有在宽度/尾部设置约束,UILabel会增加其宽度。一旦其宽度受限,例如其超视图,就会发生截断。

答案 2 :(得分:3)

您可能对该部分中的标签有约束,这会使事情变得混乱。

仔细检查您的约束或删除该标签或该部分中的其他控件。

标签的故事板选项:“换行:截断尾部”将用于您正在寻找的工作。

答案 3 :(得分:1)

如果在IB中将标签的自动收缩设置为“固定字体大小”,则当字符串宽度超出标签宽度时,您将始终获得截断。我猜你碰巧把它设置为“Minimum Font Scale”或“Minimum Font Font”,当字符串太长时会导致调整大小。

enter image description here

(Xcode 4.5,其他版本的Xcode和IB可能是不同的属性名称)

答案 4 :(得分:0)

我有两个功能,可以帮助你完成工作。

基本: 我为任务做的这个解决方案:
“将字体最小化到我的最小字体大小,然后尽可能多地放入信息,但不要大于最大宽度”

takeFineFont ...功能参数:
(UIFont*)font - 您的标签字体(titleLabel.font
(NSString*)string - 标签中的文字(titleLabel.text
(CGSize)limitStringSize - 限制尺寸 limitStringSize.width - 标签的宽度限制(上限)
limitStringSize.height - 标签的高度限制(下限)(实际上是字体大小)

-(UIFont*)takeFineFontSize:(UIFont*)font
              forText:(NSString*)string
             andLimit:(CGSize)limitStringSize{
    UIFont* resultFont = [UIFont fontWithName:[font fontName] size:[font pointSize]];
    if(limitStringSize.width != 0 && limitStringSize.height != 0){
        CGSize currentSize = [string sizeWithFont:resultFont];

        while(/* change font width with upper bound */
              currentSize.width > limitStringSize.width
              &&
              /* change font height with lower bound */
              currentSize.height > limitStringSize.height){

            /*change height and take new width*/
            currentSize.height -= 1;
            currentSize.width = [string sizeWithFont:[resultFont fontWithSize:currentSize.height]].width;
        }
        resultFont = [resultFont fontWithSize:currentSize.height];
    }
    return resultFont;
}
-(double)takeFineWidthForFont:(UIFont*)font
                    forString:(NSString*)string
                     andLimit:(double)widthLimit{
    return MIN([string sizeWithFont:font].width, widthLimit);
}

假设您在UILabel* titleLabel中有大字符串 你在某处定义:

#define maximumLengthOfYourLabel 300
#define minimumSizeOfFont 14
你现在要做什么?只做这个代码的和平:

-(void)updateTitleLabelWithBigText:(NSString*)string{

    /*change text*/
    self.titleLabel.text = string;

    /*take pretty small font*/
    self.titleLabel.font = [self takeFineFontSize:self.titleLabel.font 
                                          forText:self.titleLabel.text 
                                         andLimit:CGSizeMake(maximumLengthOfYourLabel,minimumSizeOfFont)
                                          ];

    /*if your text still big, take minimal width and trunctate it*/
    self.titleLabel.width = [self takeFineWidthForFont:self.titleLabel.font
                                             forString:self.titleLabel.text
                                              andLimit:maximumLengthOfYourLabel];
    self.titleLabel.lineBreakMode = NSLineBreakByTruncatingTail;
}

答案 5 :(得分:0)

如果您使用属性字符串并将段落样式设置为属性字符串:请确保您传递了paragraphStyle.lineBreakMode = .byTruncatingTail

答案 6 :(得分:0)

确保您没有在标签上拨打sizeToFit()。它将覆盖标签和约束设置。

答案 7 :(得分:0)

将numberOfLines设置为0,这将使您可以垂直扩展uilabel内容,而不会缩短其宽度。

答案 8 :(得分:-5)

也许这种方法可以帮到你:

  

[myLabel sizeToFit];

标签不会被截断,但会调整标签大小以适合一行。