Как вычислить высоту UILabel динамически

У меня есть следующий код:

label.numberOfLines = 0; // allows label to have as many lines as needed
label.text = @"some long text";
[label sizeToFit];

Как получить высоту метки в точках?

Ответ 1

Используйте следующий метод для вычисления динамической высоты UILabel:

- (CGFloat)getLabelHeight:(UILabel*)label
{
    CGSize constraint = CGSizeMake(label.frame.size.width, CGFLOAT_MAX);
    CGSize size;

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

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

    return size.height;
}

Ответ 2

Самый простой способ получить высоту - sizeThatFits. Используйте его так:

Objective-C

CGFloat maxLabelWidth = 100;
CGSize neededSize = [label sizeThatFits:CGSizeMake(maxLabelWidth, CGFLOAT_MAX)];

Swift 3.0

let maxLabelWidth: CGFloat = 100
let neededSize = label.sizeThatFits(CGSize(width: maxLabelWidth, height: CGFloat.greatestFiniteMagnitude))

Высота вашей метки должна быть neededSize.height.
Обратите внимание, что im использует CGFLOAT_MAX для высоты размера, чтобы убедиться, что метка имеет достаточное место для размещения в CGSize.

Высота вашего ярлыка также зависит от вашей ширины метки, поэтому я добавил maxLabelWidth, это имеет значение, если метка может быть шириной 100 или 200pt.

Надеюсь, это поможет!

Edit: Убедитесь, что вы установили label.numberOfLines = 0; иначе neededSize возвращает размер, в котором текст находится в одной строке.

Edit: Добавлена ​​версия Swift, хотя именование немного странно, наибольшее значениеFiniteMagnitude кажется правильным эквивалентом для CGFLOAT_MAX.

Ответ 3

Просто используйте [label sizeThatFits:label.frame.size];, и он вернет размер метки, который будет соответствовать данному тексту. Или вы также можете следовать question

Ответ 4

Для тех, кто хочет оценить размер метки, в методе, который оценивает высоту заголовка/ячейки в UICollectionView или UITableView, выполните следующие действия:

  • Установите maxWidth, который примет ваш ярлык
  • Создайте новый UILabel и установите для параметра numberOfLines значение 0
  • Добавить атрибуты шрифта, такие как настраиваемое имя шрифта и размер шрифта при использовании пользовательских шрифтов
  • Установите текст для этой метки и получите оценочную высоту с помощью sizeThatFits. Высота надписи neededHeight.height

Swift Версия

let maxLabelWidth:CGFloat = collectionView.frame.width - 20
let label = UILabel()
label.numberOfLines = 0
let addressFont = [ NSFontAttributeName: UIFont(name: "OpenSans", size: 12.0)! ]
let addr = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."
label.attributedText = NSMutableAttributedString(string: addr , attributes: addressFont )
let neededSize:CGSize = label.sizeThatFits(CGSizeMake(maxLabelWidth, CGFloat.max))
let labelHeight = neededSize.height

Благодаря @FabioBerger

Ответ 5

Я отредактировал Салмана Заиди немного, чтобы заставить его работать лучше для меня. Он работает хорошо, если у вас нет прямого доступа к ярлыку, например, когда вы пытаетесь получить высоту метки в heightForRowAtIndexPath:

-(CGFloat)getLabelHeight:(CGSize)labelSize string: (NSString *)string font: (UIFont *)font{

    CGSize size;

    NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
    CGSize boundingBox = [string boundingRectWithSize:labelSize
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:@{NSFontAttributeName:font}
                                                  context:context].size;

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

    return size.height;
}

Ответ 6

Я настраиваю высоту с двумя строками в label

lblUserQuestion.preferredMaxLayoutWidth = 100.0f;

100.0f, это размер, который мне нужен, и еще одна строка,

[lblUserQuestion sizeToFit];

Мой метод завершен,

UILabel *lblUserQuestion = [[UILabel alloc] initWithFrame:CGRectMake(61, 25, self.frame.size.width-61-20, 37.0f)];
    lblUserQuestion.numberOfLines= 0;
    lblUserQuestion.font =[UIFont fontWithName:@"HelveticaNeue-Thin" size:14.];
lblUserQuestion.adjustsFontSizeToFitWidth = YES;
    lblUserQuestion.minimumScaleFactor = 0.5;
    lblUserQuestion.preferredMaxLayoutWidth= 100.0f;
    lblUserQuestion.text = _photoToVote.label; 

Ответ 7

Вы можете создать ярлык динамически:

-(CGRect)newLableSize:(NSString *)lableString
{
     NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
     [paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping];

        CGFloat tempwidth = YourStaticLabelWidth * ScreenWidth / 320;
        NSMutableArray *array=[[NSMutableArray alloc]initWithObjects: lableString,nil];
       CGRect newLabelsize = [[array objectAtIndex:0] boundingRectWithSize:CGSizeMake(tempwidth, MAXFLOAT)  options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:selectFont,NSParagraphStyleAttributeName:paragraphStyle} context:nil];   

        NSLog(@"New Label Size Width  : %f",newLabelsize.size.width);
        NSLog(@"New Label Size Height : %f",newLabelsize.size.height);

        return newLabelsize;
}

Ответ 8

- (CGFloat)getTextHeightByWidth:(NSString*)text textFont:(UIFont*)textFont textWidth:(float)textWidth {

    if (!text) {
        return 0;
    }
    CGSize boundingSize = CGSizeMake(textWidth, CGFLOAT_MAX);
    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{ NSFontAttributeName: textFont }];

    CGRect rect = [attributedText boundingRectWithSize:boundingSize options:NSStringDrawingUsesLineFragmentOrigin context:nil];
    CGSize requiredSize = rect.size;
    return requiredSize.height;
}

- (CGFloat)getTextWidthByHeight:(NSString*)text textFont:(UIFont*)textFont textHeight:(float)textHeight {

    if (!text) {
        return 0.0f;
    }
    CGSize boundingSize = CGSizeMake(CGFLOAT_MAX, textHeight);

    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text
                                                                         attributes:@{ NSFontAttributeName: textFont }];

    CGRect rect = [attributedText boundingRectWithSize:boundingSize
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    CGSize requiredSize = rect.size;
    return requiredSize.width;
}

Ответ 9

 - (CGFloat)getLabelsize:(UILabel *)label
{
    CGSize maxSize = CGSizeMake(label.frame.size.width, 9999);
    CGSize requiredSize = [label sizeThatFits:maxSize];

    return requiredSize.height;
}

Ответ 10

Используйте эту функцию

+ (CGFloat)heightForText:(NSString*)text font:(UIFont*)font withinWidth:(CGFloat)width {

    CGSize constraint = CGSizeMake(width, 20000.0f);
    CGSize size;

    CGSize boundingBox = [text boundingRectWithSize:constraint
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:@{NSFontAttributeName:font}
                                                  context:nil].size;

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

    return size.height;
}