简体   繁体   中英

UILabel truncate text not working

I set the numberOfLines to 1 in the IB, but when I set the text to a long string, it doesn't truncate. If I set the numberOfLines to 2, the truncate works fine.What should I do to truncate a long string into a single line?

simple, set the following properties:

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

If using auto layout, in my case, there was a constraint missing. The UILabel grows its width if no constraint is set on its width/trailing. Once its width is limited, for instance to its superview, the truncation occurs.

You probably have a constraint on a label in that section that is making things go haywire.

Double check your constraints or remove them for that label or other controls in that section.

The storyboard option for a label: "Line Breaks:Truncate Tail" will to the work you are looking for.

If you set the label's autoshrink to "Fixed Font Size" in IB, you will always get a truncatation when the string width beyond the label width. I guess you happened to set that to "Minimum Font Scale" or "Minimum Font Font", which will lead a resizing when the string is too long.

在此输入图像描述

(Xcode 4.5, other version of Xcode and IB may be different property name)

I make two functions, that will help you to do your work.

Basic: This solution I made for task:
"minimize font to my min size of font and then put as much info, as possible, but not bigger then maximum width"

takeFineFont... function parameters:
(UIFont*)font - font of the your label ( titleLabel.font )
(NSString*)string - text in your label ( titleLabel.text )
(CGSize)limitStringSize - limit size.
limitStringSize.width - width limit of your label (Upper limit)
limitStringSize.height - height limit of your label (Lower limit)(actually, size of font)

-(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);
}

Suppose, that you have big string in UILabel* titleLabel
And you define somewhere:

#define maximumLengthOfYourLabel 300
#define minimumSizeOfFont 14

what you will do now? just do this peace of code:

-(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;
}

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

Ensure you are not calling sizeToFit() on your label. It will override the label and constraint settings.

将numberOfLines设置为0,这将允许您在不截断其宽度的情况下垂直扩展uilabel内容。

Perhaps this method can help you:

[myLabel sizeToFit];

The label won't be truncated but it will adjust the label size to fit in one line.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM