How to tell when a UILabel will be truncated an/or its line break position will change

后端 未结 5 1304
栀梦
栀梦 2021-01-13 01:38

I have a multi-line UILabel (numberOfLines = 0). It\'s width can change at runtime, and sometimes this leads to truncation and/or re-wrapping. Some

5条回答
  •  迷失自我
    2021-01-13 02:37

    You could know the size of label that is needed to display a particular NSString instance. For example, you could use that one:

    - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode

    Returns the size of the string if it were rendered with the specified constraints.

    So what you want is to get CGSize for a particular string and check if it is not larger then UILabel size:

        UILabel *label;
        CGSize sizeNeeded = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, MAXFLOAT)];
        if (sizeNeeded.height > label.bounds.size.height)
        {
            NSLog(@"String is truncated");
        }
    

    More useful NSString methods you could find here: NSString UIKit Additions Reference

    Ok, another way of doing what you want:

    1) Create 2 UILabel with the same properties but second one (label2) will be with another one width.

    2) Set alpha property of label2 to 0.0 in non-edit mode.

    3) When edit mode begins make such animation:

    // label1.alpha == 1.0, label2.alpha == 0.0 
    {[UIView animateWithDuration:0.5 animations:^{
        label1.alpha = 0.0;
        label2.alpha = 1.0;
    }];
    

    4) When edit mode ends:

    {[UIView animateWithDuration:0.5 animations:^{
        label1.alpha = 1.0;
        label2.alpha = 0.0;
    }];
    

    That will give you the same result as in Mail.app

提交回复
热议问题