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

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

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

Ответы

Ответ 1

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

Или зарегистрируйтесь в этом сообщении: fooobar.com/questions/6054/...

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

@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, структура изменит размер вашей метки соответствующим образом (добавив больше высоты) в соответствии с вашим текстом.

Ответ 2

Использование [label sizeToFit]; приведет к такому же результату в категории Daniels.

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

Ответ 3

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

Действия

  • Поместите UILabel в контроллер и поместите его туда, где хотите. Также поставьте 0 для свойства numberOfLines UILabel.

  • Дайте ограничение на верхнее, ведущее и трейлинг-пространство.

enter image description here

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

enter image description here

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

Ответ 4

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

введите описание изображения здесь

Подключите левый и верхний края

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

введите описание изображения здесь

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

Примечания

  • Не добавляйте ограничения для ширины и высоты. Ярлыки имеют внутренний размер, основанный на их текстовом содержимом.
  • Спасибо за этот ответ за помощью.
  • При использовании автоматического макета не нужно устанавливать 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, то см. этот ответ.

введите описание изображения здесь

Ответ 5

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

Ответ 6

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

-(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];
}

Ответ 7

@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.

Ответ 8

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

  • Для 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
    

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

Ответ 9

  • Добавьте отсутствующие ограничения в раскадровку.
  • Выберите UILabel в раскадровке и установите для атрибутов "Линия" значение 0.
  • Ref Вывести UILabel на Controller.h с идентификатором: label
  • Controller.m и добавить [label sizeToFit]; в viewDidLoad

Ответ 10

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

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

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

Ответ 11

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

    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];

Ответ 12

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

[self.yourLableName sizeToFit];

Ответ 13

Существует также такой подход:

[self.myLabel changeTextWithAutoHeight:self.myStringToAssignToLabel width:180.0f];