Изменение высоты UILabel динамически на основе контента

У меня есть UILabel как subview UIButton, и я передаю значение с другого представления и заселения в UILabel. Теперь я хочу, чтобы UILabel должен изменить свою высоту на основе содержимого. Если текст "Hello", он должен быть в 1 строке, но если текст "мой текст слишком длинный, чтобы вписаться в label ", он должен изменить свой размер. Я использовал

   [self.addressLabel sizeToFit];

Но для этого мне нужно оставить пустое пространство ниже UILabel. Просто, что я хочу, чтобы при увеличении силы текста размер UILabel и UIView должен расширяться.

Ответ 1

Используя ниже, вы можете получить высоту метки

  • текст - текст метки
  • font - font, используемый в метке
  • width - ширина метки

    -(float) getHeightForText:(NSString*) text withFont:(UIFont*) font andWidth:(float) width{
        CGSize constraint = CGSizeMake(width , 20000.0f);
        CGSize title_size;
        float totalHeight;
    
        SEL selector = @selector(boundingRectWithSize:options:attributes:context:);
        if ([text respondsToSelector:selector]) {                
            title_size = [text boundingRectWithSize:constraint
                                            options:NSStringDrawingUsesLineFragmentOrigin
                                         attributes:@{ NSFontAttributeName : font }
                                            context:nil].size;
    
            totalHeight = ceil(title_size.height); 
        } else {                
            title_size = [text sizeWithFont:font
                          constrainedToSize:constraint
                              lineBreakMode:NSLineBreakByWordWrapping];                
            totalHeight = title_size.height ;                
        }
    
        CGFloat height = MAX(totalHeight, 40.0f);
        return height;            
    }
    

и создайте кадр с использованием высоты

CGRect frame = questionTitleLbl.frame;

float height = [self getHeightForText:questionTitleLbl.text 
                             withFont:questionTitleLbl.font
                            andWidth:questionTitleLbl.frame.size.width];
float gap = 2;

cell.questionTitleLbl.frame = CGRectMake(frame.origin.x, 
                                         frame.origin.y, 
                                         frame.size.width, 
                                         height);

Ответ 2

Вот как я справляюсь с этой проблемой:

UILabel *sight = (UILabel *)[cell viewWithTag:100];
sight.text=tmpGroup.title;

sight.frame =CGRectMake(sight.frame.origin.x, sight.frame.origin.y, 191, 21);


sight.font = [UIFont fontWithName:@"RobotoSlab-Bold" size:10];


sight.numberOfLines=0;
sight.lineBreakMode=NSLineBreakByWordWrapping;

[sight sizeToFit];

Ответ 3

Используйте этот код очень легко и обновлен с помощью ios8

добавьте этот метод в свой файл appconstant

inline static CGSize getLabelHeightForFont(NSString *fontName,NSString* str, float fontSize, float lblWidth)
{
    NSString *text = str;
    CGFloat width = lblWidth;
    UIFont *font = [UIFont fontWithName:fontName size:fontSize];

    NSAttributedString *attributedText =
    [[NSAttributedString alloc]
     initWithString:text
     attributes:@
     {
     NSFontAttributeName: font
     }];
    CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    return rect.size;


}

и, наконец, использовать этот код для динамического создания UILabel

CGFloat lbl_height = getLabelHeightForFont(@"System- System", address, 15, lbl_address.frame.size.width);
    lbl_address.numberOfLines = 0;
    lbl_address.textAlignment = NSTextAlignmentLeft;
    [lbl_address setLineBreakMode:NSLineBreakByWordWrapping];
    lbl_address.frame = CGRectMake(lbl_address.frame.origin.x, lbl_address.frame.origin.y, lbl_address.frame.size.width, lbl_height+5);

Ответ 4

Это самая простая функция для получения динамической высоты для меток. Вы можете просто использовать эту функцию.
Здесь ceil - это функция predefind для возврата наименьшего целочисленного значения. И MAXHEIGHT - максимальная высота для uilabel, например, вы можете дать 1000 также для будущих калокаций...

-(CGFloat) getHeightForLabels : (UILabel *) label
    {

        CGSize widthMaxHeight = CGSizeMake(label.frame.size.width, MAXHEIGHT);
        CGSize size;

        NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
        CGSize boundingRect = [label.text boundingRectWithSize:widthMaxHeight
                                                      options:NSStringDrawingUsesLineFragmentOrigin
                                                   attributes:@{NSFontAttributeName:label.font}
                                                      context:context].size;

        size = CGSizeMake(ceil(boundingRect.width), ceil(boundingRect.height));

        return size.height;
    }