Отрегулируйте высоту UILabel в зависимости от текста - PullRequest
306 голосов
/ 15 января 2009

Предположим, у меня есть следующий текст в UILabel (длинная строка динамического текста):

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

Я хочу изменить высоту UILabel's, чтобы текст мог уместиться. Я использую следующие свойства UILabel, чтобы сделать текст внутри для переноса.

myUILabel.lineBreakMode = UILineBreakModeWordWrap;
myUILabel.numberOfLines = 0;

Пожалуйста, дайте мне знать, если я не иду в правильном направлении. Спасибо.

Ответы [ 34 ]

407 голосов
/ 15 января 2009

sizeWithFont constrainedToSize:lineBreakMode: - это метод для использования. Пример того, как использовать это ниже:

//Calculate the expected size based on the font and linebreak mode of your label
// FLT_MAX here simply means no constraint in height
CGSize maximumLabelSize = CGSizeMake(296, FLT_MAX);

CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font constrainedToSize:maximumLabelSize lineBreakMode:yourLabel.lineBreakMode];   

//adjust the label the the new height.
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;
237 голосов
/ 20 августа 2009

Вы шли в правильном направлении. Все, что вам нужно сделать, это:

myUILabel.numberOfLines = 0;
myUILabel.text = @"Enter large amount of text here";
[myUILabel sizeToFit];
42 голосов
/ 05 ноября 2013

В iOS 6 Apple добавила свойство к UILabel , которое значительно упрощает динамическое вертикальное изменение размера этикеток: предпочитаемый размер_пакета Max_ay .

Использование этого свойства в сочетании с lineBreakMode = NSLineBreakByWordWrapping и sizeToFit позволяет легко изменять размер экземпляра UILabel до высоты, которая вмещает весь текст.

Цитата из документации iOS:

preferredMaxLayoutWidth Предпочтительная максимальная ширина (в точках) для многострочной метки.

Обсуждение Это свойство влияет на размер метки, когда к ней применяются ограничения макета. Если во время макета текст выходит за пределы ширины, заданной этим свойством, дополнительный текст передается одной или нескольким новым строкам, что увеличивает высоту метки.

Образец:

...
UILabel *status = [[UILabel alloc] init];
status.lineBreakMode = NSLineBreakByWordWrapping;
status.numberOfLines = 5; // limits to 5 lines; use 0 for unlimited.

[self addSubview:status]; // self here is the parent view

status.preferredMaxLayoutWidth = self.frame.size.width; // assumes the parent view has its frame already set.

status.text = @"Some quite lengthy message may go here…";
[status sizeToFit];
[status setNeedsDisplay];
...
36 голосов
/ 18 июня 2015

Вместо этого, делая это программно, вы можете сделать это в Storyboard / XIB во время проектирования.

  • Установите свойство количества строк в UIlabel 0 в инспекторе атрибутов.
  • Затем установите ограничение ширины / (или) начальное и конечное ограничение согласно требованию.
  • Тогда установить ограничение по высоте с минимальное значение . Наконец, выберите добавленное ограничение по высоте и в инспекторе размера, следующее за инспектором атрибутов, измените отношение ограничения высоты с равно - больше чем .
34 голосов
/ 26 апреля 2016

Проверьте эту работу совершенно без добавления одной строки кода. (С использованием Autolayout)

Я сделал демо для вас по вашему требованию. Скачайте его по ссылке ниже,

Авторазмер UIView и UILabel

Пошаговое руководство: -

Шаг 1: - Установить ограничение на UIView

1) Ведущий 2) Топ 3) Трейлинг (Из основного обзора)

enter image description here

Шаг 2: - Установить ограничение на метку 1

1) Ведущий 2) Топ 3) Трейлинг (Из супер-просмотра)

enter image description here

Шаг 3: - Установить ограничение для метки 2

1) Ведущий 2) Трейлинг (Из супер-просмотра)

enter image description here

Шаг 4: - Самый хитрый Дайте Ботлону UILabel из UIView.

enter image description here

Шаг 5: - (Необязательно) Установите ограничение на UIButton

1) Ведущий 2) Низ 3) Трейлинг 4) Фиксированная высота (из основного обзора)

enter image description here

Выход: -

enter image description here

Примечание: - Убедитесь, что вы установили Number of lines = 0 в свойстве Label.

enter image description here

Надеюсь, этой информации достаточно, чтобы понять Autoresize UIView в соответствии с высотой UILabel и Autoresize UILabel в соответствии с текстом.

15 голосов
/ 23 ноября 2010

Спасибо, ребята, за помощь, вот код, который я пробовал, который работает для меня

   UILabel *instructions = [[UILabel alloc]initWithFrame:CGRectMake(10, 225, 300, 180)];
   NSString *text = @"First take clear picture and then try to zoom in to fit the ";
   instructions.text = text;
   instructions.textAlignment = UITextAlignmentCenter;
   instructions.lineBreakMode = NSLineBreakByWordWrapping;
   [instructions setTextColor:[UIColor grayColor]];

   CGSize expectedLabelSize = [text sizeWithFont:instructions.font 
                                constrainedToSize:instructions.frame.size
                                    lineBreakMode:UILineBreakModeWordWrap];

    CGRect newFrame = instructions.frame;
    newFrame.size.height = expectedLabelSize.height;
    instructions.frame = newFrame;
    instructions.numberOfLines = 0;
    [instructions sizeToFit];
    [self addSubview:instructions];
12 голосов
/ 24 февраля 2014

Решение для iOS7 до и iOS7 выше

//
//  UILabel+DynamicHeight.m
//  For StackOverFlow
//
//  Created by Vijay on 24/02/14.
//  Copyright (c) 2014 http://Vijay-Apple-Dev.blogspot.com. All rights reserved.
//

#import <UIKit/UIKit.h>

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

#define iOS7_0 @"7.0"

@interface UILabel (DynamicHeight)

/*====================================================================*/

/* Calculate the size,bounds,frame of the Multi line Label */

/*====================================================================*/
/**
 *  Returns the size of the Label
 *
 *  @param aLabel To be used to calculte the height
 *
 *  @return size of the Label
 */

-(CGSize)sizeOfMultiLineLabel;

@end


//
//  UILabel+DynamicHeight.m
//  For StackOverFlow
//
//  Created by Vijay on 24/02/14.
//  Copyright (c) 2014 http://Vijay-Apple-Dev.blogspot.com. All rights reserved.
//

#import "UILabel+DynamicHeight.h"

@implementation UILabel (DynamicHeight)
/*====================================================================*/

/* Calculate the size,bounds,frame of the Multi line Label */

/*====================================================================*/
/**
 *  Returns the size of the Label
 *
 *  @param aLabel To be used to calculte the height
 *
 *  @return size of the Label
 */
-(CGSize)sizeOfMultiLineLabel{

    NSAssert(self, @"UILabel was nil");

    //Label text
    NSString *aLabelTextString = [self text];

    //Label font
    UIFont *aLabelFont = [self font];

    //Width of the Label
    CGFloat aLabelSizeWidth = self.frame.size.width;


    if (SYSTEM_VERSION_LESS_THAN(iOS7_0)) {
        //version < 7.0

        return [aLabelTextString sizeWithFont:aLabelFont
                            constrainedToSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                lineBreakMode:NSLineBreakByWordWrapping];
    }
    else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(iOS7_0)) {
        //version >= 7.0

        //Return the calculated size of the Label
        return [aLabelTextString boundingRectWithSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : aLabelFont
                                                        }
                                              context:nil].size;

    }

    return [self bounds].size;

}

@end
10 голосов
/ 14 ноября 2014

Поскольку sizeWithFont устарела, я использую этот.

этот получает специфичные для метки атрибуты.

-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text{

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

    return ceil(rect.size.height);
}
6 голосов
/ 10 апреля 2013

Вот версия категории:

UILabel + AutoSize.h #import

@interface UILabel (AutoSize)

- (void) autosizeForWidth: (int) width;

@end

UILabel + AutoSize.m

#import "UILabel+AutoSize.h"

@implementation UILabel (AutoSize)

- (void) autosizeForWidth: (int) width {
    self.lineBreakMode = UILineBreakModeWordWrap;
    self.numberOfLines = 0;
    CGSize maximumLabelSize = CGSizeMake(width, FLT_MAX);
    CGSize expectedLabelSize = [self.text sizeWithFont:self.font constrainedToSize:maximumLabelSize lineBreakMode:self.lineBreakMode];
    CGRect newFrame = self.frame;
    newFrame.size.height = expectedLabelSize.height;
    self.frame = newFrame;
}

@end
6 голосов
/ 15 января 2009

Вы можете реализовать метод TableViewController's (UITableViewCell *)tableView:cellForRowAtIndexPath следующим образом (например):

#define CELL_LABEL_TAG 1

- (UITableViewCell *)tableView:(UITableView *)tableView  cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *text = @"my long text";

    static NSString *MyIdentifier = @"MyIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero  reuseIdentifier:identifier] autorelease];
    }

    CGFloat width = [UIScreen mainScreen].bounds.size.width - 50;
    CGFloat height = [self textHeight:text] + 10;
    CGRect frame = CGRectMake(10.0f, 10.0f, width, height);

    UILabel *cellLabel = [[UILabel alloc] initWithFrame:frame];
    cellLabel.tag = CELL_LABEL_TAG;
    cellLabel.textColor = [UIColor blackColor];
    cellLabel.backgroundColor = [UIColor clearColor];
    cellLabel.textAlignment = UITextAlignmentLeft;
    cellLabel.font = [UIFont systemFontOfSize:12.0f];
    [cell.contentView addSubview:cellLabel];
    [cellLabel release];

    return cell;
}

UILabel *label = (UILabel *)[cell viewWithTag:CELL_LABEL_TAG];
label.text = text;
label.numberOfLines = 0;
[label sizeToFit];
return cell;

Также используйте метод NSString sizeWithFont:constrainedToSize:lineBreakMode: для вычисления высоты текста.

...