UILabel - метка авторазмера под текст?

Можно ли автоматически изменить размер поля / границ UILabel, чтобы оно соответствовало содержанию текста? (Мне все равно, если он окажется больше, чем дисплей)

Так что, если пользователь вводит "привет" или "мое имя действительно длинное, я хочу, чтобы оно вписывалось в это поле", оно никогда не будет усечено, а метка соответственно "расширена"?

15 ответов

Решение

Пожалуйста, проверьте мою суть, где я сделал категорию для UILabel для чего-то очень похожего, моя категория позволяет UILabel увеличьте его высоту, чтобы показать весь контент: https://gist.github.com/1005520

Или проверить этот пост: /questions/21202682/izmenenie-razmera-uilabel-v-zavisimosti-ot-soderzhimogo/21202692#21202692

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

@implementation UILabel (dynamicSizeMeWidth)

- (void)resizeToStretch{
    float width = [self expectedWidth];
    CGRect newFrame = [self frame];
    newFrame.size.width = width;
    [self setFrame:newFrame];
}

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize maximumLabelSize = CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX);

    CGSize expectedLabelSize = [[self text] sizeWithFont:[self font] 
                                            constrainedToSize:maximumLabelSize
                                            lineBreakMode:[self lineBreakMode]]; 
    return expectedLabelSize.width;
}

@end

Вы могли бы более просто использовать sizeToFit метод доступен из UIView класс, но установите количество строк в 1, чтобы быть безопасным.


обновление iOS 6

Если вы используете AutoLayout, то у вас есть встроенное решение. Установив число строк равным 0, каркас будет соответствующим образом изменять размер вашей метки (добавляя больше высоты), чтобы соответствовать вашему тексту.


обновление iOS 8

sizeWithFont: не рекомендуется использовать sizeWithAttributes: вместо:

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];

    return expectedLabelSize.width;
}

С помощью [label sizeToFit]; достигнет того же результата из категории Дэниелс.

Хотя я рекомендую использовать autolayout и позволить метке самостоятельно изменять размер в зависимости от ограничений.

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

меры

  1. Поместите UILabel в поле зрения контроллера и разместите его там, где вы хотите. Также положить 0 за numberOfLines собственностью UILabel,

  2. Дайте ему ограничение Top, Leading и Trailing space.

  1. Теперь он выдаст предупреждение. Нажмите на желтую стрелку.

  1. Нажмите на Update Frame и нажмите на Fix Misplacement, Теперь эта UILabel будет уменьшаться, если текст меньше, и расширяется, если текст больше.

Это не так сложно, как делают некоторые другие ответы.

Прикрепите левый и верхний края

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

После этого он автоматически изменит размер.

Заметки

  • Не добавляйте ограничения для ширины и высоты. Ярлыки имеют собственный размер в зависимости от их текстового содержимого.
  • Спасибо за этот ответ за помощь с этим.
  • Не нужно устанавливать sizeToFit при использовании автоматического макета. Мой полный код для примера проекта здесь:

    import UIKit
    class ViewController: UIViewController {
    
        @IBOutlet weak var myLabel: UILabel!
    
        @IBAction func changeTextButtonTapped(sender: UIButton) {
            myLabel.text = "my name is really long i want it to fit in this box"
        }
    }
    
  • Если вы хотите, чтобы ваша метка была переносом строк, установите число строк в 0 в IB и добавьте myLabel.preferredMaxLayoutWidth = 150 // or whatever в коде. (Я также прикрепил кнопку к нижней части этикетки, чтобы она могла двигаться вниз при увеличении высоты этикетки.)

  • Если вы ищете для динамического размера меток внутри UITableViewCell тогда посмотрите этот ответ.

Использование [label sizeToFit]; настроить текст в UILabel

Вот что я нахожу работы для моей ситуации:

1) Высота UILabel имеет ограничение>= 0, используя autolayout. Ширина фиксирована. 2) Назначьте текст в UILabel, у которого уже есть супервизия на данный момент (не уверен, насколько это важно). 3) Затем выполните:

    label.sizeToFit()
    label.layoutIfNeeded()

Высота метки теперь установлена ​​соответствующим образом.

Я создал несколько методов, основанных на ответе Даниила выше.

-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text
{
    CGSize maximumLabelSize     = CGSizeMake(290, FLT_MAX);

    CGSize expectedLabelSize    = [text sizeWithFont:label.font
                                constrainedToSize:maximumLabelSize
                                    lineBreakMode:label.lineBreakMode];

    return expectedLabelSize.height;
}

-(void)resizeHeightToFitForLabel:(UILabel *)label
{
    CGRect newFrame         = label.frame;
    newFrame.size.height    = [self heightForLabel:label withText:label.text];
    label.frame             = newFrame;
}

-(void)resizeHeightToFitForLabel:(UILabel *)label withText:(NSString *)text
{
    label.text              = text;
    [self resizeHeightToFitForLabel:label];
}

Вы можете изменить размер этикетки в соответствии с текстом и другими элементами управления, используя два способа:

  1. Для iOS 7.0 и выше

    CGSize labelTextSize = [labelText boundingRectWithSize:CGSizeMake(labelsWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : labelFont
                                                        }
                                              context:nil].size;
    

до iOS 7.0 это можно было использовать для расчета размера этикетки

CGSize labelTextSize = [label.text sizeWithFont:label.font 
                            constrainedToSize:CGSizeMake(label.frame.size.width, MAXFLOAT)  
                                lineBreakMode:NSLineBreakByWordWrapping];

// переоснащаем другие элементы управления на основе labelTextHeight

CGFloat labelTextHeight = labelTextSize.height;
  1. Если вы не хотите вычислять размер текста метки, вы можете использовать -sizeToFit в экземпляре UILabel as-

    [label setNumberOfLines:0]; // for multiline label
    [label setText:@"label text to set"];
    [label sizeToFit];// call this to fit size of the label according to text
    

// после этого вы можете получить рамку метки для перефразирования других связанных элементов управления

@implementation UILabel (UILabel_Auto)

- (void)adjustHeight {

    if (self.text == nil) {
        self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.bounds.size.width, 0);
        return;
    }

    CGSize aSize = self.bounds.size;
    CGSize tmpSize = CGRectInfinite.size;
    tmpSize.width = aSize.width;

    tmpSize = [self.text sizeWithFont:self.font constrainedToSize:tmpSize];

    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, aSize.width, tmpSize.height);
}

@end

Это метод категории. Сначала вы должны установить текст, а затем вызывать этот метод для настройки высоты UILabel.

метод sizeToFit() плохо работает с ограничениями, но в iOS 9 это все, что вам нужно —

      label.widthAnchor.constraint(equalToConstant: label.intrinsicContentSize.width).activate()
  1. Добавьте недостающие ограничения в раскадровку.
  2. Выберите UILabel в раскадровке и установите атрибуты "Линия" на 0.
  3. Перевести UILabel в Controller.h с идентификатором: label
  4. Controller.m и добавить [label sizeToFit]; в viewDidLoad

У меня были огромные проблемы с авторазборкой. У нас есть два контейнера внутри ячейки таблицы. Размер второго контейнера изменяется в зависимости от описания элемента (0 - 1000 символов), и размер строки должен изменяться в зависимости от них.

Недостающий ингредиент был нижним ограничением для описания.

Я изменил нижнее ограничение динамического элемента с = 0 на > = 0.

Подходит каждый раз!:)

    name.text = @"Hi this the text I want to fit to"
    UIFont * font = 14.0f;
    CGSize size = [name.text sizeWithAttributes:@{NSFontAttributeName: font}];
    nameOfAssessment.frame = CGRectMake(400, 0, size.width, 44);
    nameOfAssessment.font = [UIFont systemFontOfSize:font];

Вы можете показать вывод одной строки, затем установить свойство Line=0 и показать вывод нескольких строк, затем установить свойство Line=1 и более

[self.yourLableName sizeToFit];

Также есть такой подход:

[self.myLabel changeTextWithAutoHeight:self.myStringToAssignToLabel width:180.0f];
Другие вопросы по тегам