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

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

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

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

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

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

Ответы [ 34 ]

2 голосов
/ 21 февраля 2009

Спасибо за этот пост. Это мне очень помогло. В моем случае я также редактирую текст в отдельном контроллере представления. Я заметил, что когда я использую:

[cell.contentView addSubview:cellLabel];

в tableView: cellForRowAtIndexPath: метод, которым представление метки постоянно отображалось поверх предыдущего представления каждый раз, когда я редактировал ячейку. Текст стал пикселированным, и когда что-то было удалено или изменено, предыдущая версия была видна под новой версией. Вот как я решил проблему:

if ([[cell.contentView subviews] count] > 0) {
    UIView *test = [[cell.contentView subviews] objectAtIndex:0];
    [test removeFromSuperview];
}
[cell.contentView insertSubview:cellLabel atIndex:0];

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

1 голос
/ 21 мая 2009

Крис один ответ неверный.

newFrame.size.height = maximumLabelSize.height;

должно быть

newFrame.size.height = expectedLabelSize.height;

Кроме этого, это правильное решение.

1 голос
/ 07 апреля 2016

Этот метод даст идеальную высоту

-(float) getHeightForText:(NSString*) text withFont:(UIFont*) font andWidth:(float) width{
CGSize constraint = CGSizeMake(width , 20000.0f);
CGSize title_size;
float totalHeight;


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

totalHeight = ceil(title_size.height);

CGFloat height = MAX(totalHeight, 40.0f);
return height;
}
1 голос
/ 08 июня 2015

Мой код:

UILabel *label      = [[UILabel alloc] init];
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
label.text          = text;
label.textAlignment = NSTextAlignmentCenter;
label.font          = [UIFont fontWithName:_bodyTextFontFamily size:_bodyFontSize];

CGSize size = [label sizeThatFits:CGSizeMake(width, MAXFLOAT)];


float height        = size.height;
label.frame         = CGRectMake(x, y, width, height);
1 голос
/ 29 апреля 2015
NSString *str = @"Please enter your text......";
CGSize lblSize = [str sizeWithFont:[UIFont systemFontOfSize:15] constrainedToSize: CGSizeMake(200.0f, 600.0f) lineBreakMode: NSLineBreakByWordWrapping];

UILabel *label = [[UILabel alloc]init];
label.frame = CGRectMake(60, 20, 200, lblSize.height);
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
label.font = [UIFont systemFontOfSize:15];
label.text = str;
label.backgroundColor = [UIColor clearColor];
[label sizeToFit];
[self.view addSubview:label];
1 голос
/ 21 января 2017
myLabel.text = "your very long text"
myLabel.numberOfLines = 0
myLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping

Пожалуйста, установите ограничения для UILable в раскадровке, включая верхний левый и нижний правый

1 голос
/ 16 января 2009

Наконец-то все заработало. Спасибо, ребята.

У меня не получилось, потому что я пытался изменить размер метки в heightForRowAtIndexPath методе:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

и (да, глупый я), я изменял размер метки до значения по умолчанию в методе cellForRowAtIndexPath - я пропускал код, который я написал ранее:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
1 голос
/ 29 августа 2012
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    cellIdentifier = @"myCell";
    cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    cell.myUILabel.lineBreakMode = UILineBreakModeWordWrap;        
    cell.myUILabel.numberOfLines = 0;
    cell.myUILabel.text = @"Some very very very very long text....."
    [cell.myUILabel.criterionDescriptionLabel sizeToFit];    
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    CGFloat rowHeight = cell.myUILabel.frame.size.height + 10;

    return rowHeight;    
}
1 голос
/ 19 октября 2017

Добавление к ответам выше:

Этого легко достичь с помощью раскадровки.

  1. Установить ограничение для UILabel. (В моем случае я сделал верхнюю, левую и фиксированную ширину)
  2. Установить Номер строки в 0 в Инспекторе атрибутов
  3. Установить Разрыв строки для WordWrap в Инспекторе атрибутов.

UILabel Height Adjust

1 голос
/ 19 июля 2017

Мой подход к вычислению динамической высоты UILabel.

    let width = ... //< width of this label 
    let text = ... //< display content

    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping
    label.preferredMaxLayoutWidth = width

    // Font of this label.
    //label.font = UIFont.systemFont(ofSize: 17.0)
    // Compute intrinsicContentSize based on font, and preferredMaxLayoutWidth
    label.invalidateIntrinsicContentSize() 
    // Destination height
    let height = label.intrinsicContentSize.height

Обертка для работы:

func computeHeight(text: String, width: CGFloat) -> CGFloat {
    // A dummy label in order to compute dynamic height.
    let label = UILabel()

    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping
    label.font = UIFont.systemFont(ofSize: 17.0)

    label.preferredMaxLayoutWidth = width
    label.text = text
    label.invalidateIntrinsicContentSize()

    let height = label.intrinsicContentSize.height
    return height
}
...