UILabel - метка авторазмера под текст? - PullRequest
139 голосов
/ 10 января 2012

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

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

Ответы [ 14 ]

97 голосов
/ 10 января 2012

Пожалуйста, проверьте мою суть, где я сделал категорию для 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;
}
74 голосов
/ 31 октября 2013

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

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

32 голосов
/ 05 мая 2015

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

Steps

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

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

enter image description here

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

enter image description here

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

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

enter image description here

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

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

enter image description here

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

Примечания

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

9 голосов
/ 21 мая 2014

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

5 голосов
/ 26 января 2013

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

-(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];
}
3 голосов
/ 10 января 2012
@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.

2 голосов
/ 28 апреля 2018

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

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

    label.sizeToFit()
    label.layoutIfNeeded()

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

2 голосов
/ 11 августа 2015
  1. Добавить недостающие ограничения в раскадровку.
  2. Выберите UILabel в раскадровке и установите для атрибутов «Линия» значение 0.
  3. Ref Выход UILabel в Controller.h с идентификатором: label
  4. Controller.m и добавьте [label sizeToFit]; в viewDidLoad
2 голосов
/ 27 апреля 2015

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

  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
    

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...