it-swarm.com.ru

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

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

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

135
wayneh

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

Или проверить этот пост: https://stackoverflow.com/a/7242981/662605

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

@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;
}
96
Daniel

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

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

70
Guilherme Torres Castro

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

Меры

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

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

enter image description here

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

enter image description here

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

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

 enter image description here

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

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

 enter image description here

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

Заметки

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

 enter image description here

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

 enter image description here

20
Suragch

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

9
Gaurav Gilani

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

-(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];
}
5
Doug Baker
@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.

3
Kaijay Lu

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

  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
    

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

2
vijeesh

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

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

    label.sizeToFit()
    label.layoutIfNeeded()

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

2
Chris Prince
  1. Добавьте недостающие ограничения в раскадровку.
  2. Выберите UILabel в раскадровке и установите атрибуты «Линия» на 0.
  3. Переведите UILabel в Controller.h с идентификатором: label
  4. Controller.m и добавьте [label sizeToFit]; в viewDidLoad
2
user2941395

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

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

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

1
Bojan Tadic

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

[self.yourLableName sizeToFit];
0
Dixit Akabari

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

    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];
0
Hannah Louisa Carney