UILabel не является автоматически сокращающимся текстом, чтобы соответствовать размеру ярлыка

У меня есть эта странная проблема, и я занимаюсь ею уже более 8 часов. В зависимости от ситуации я должен динамически вычислять размер UILabels
например, my UIViewController получает событие и меняет размер UILabels. от большего до меньшего. Размер моего UILabel становится меньше, и я получаю нужный размер, но текст в моем UILabel остается прежним, тот же размер шрифта и т.д. Мне нужен шрифт, чтобы он стал меньше, поскольку весь текст должен соответствовать UILabel. Итак, вопрос в том, как сделать текст подходящим для моего ярлыка с помощью autoshrinking или что-то в этом роде?

В моем xib, UILabels autoshrink отмечено, также количество строк установлено в 0, а также моя строка содержит новые строковые символы (\n) и я ' ve выбрал linebreakmode на wordwrap. Может быть, кто-то был в той же ситуации, что и я, и мог мне помочь? Я был бы очень признателен.

Спасибо заранее!

EDIT: UILabel минимальный размер шрифта равен 10

Ответ 1

Если вы все еще ищете лучшее решение, я думаю, что это то, что вы хотите:

Логическое значение, указывающее, следует ли уменьшить размер шрифта, чтобы он соответствовал строке заголовка в прямоугольнике, ограничивающем метки. (Это свойство действует только тогда, когда для свойства numberOfLines установлено значение 1.)

@property(nonatomic) BOOL adjustsFontSizeToFitWidth

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

@property(nonatomic) BOOL adjustsLetterSpacingToFitWidth

Источник.

Ответ 2

Вот как я делаю работу UILabel Autoshrink (особенно для высоты установки шрифта ярлыка в устройстве 4s из 6s Plus Storyboard) в iOS 9.2, Xcode 7.2...

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

  • Число строк: 0
  • Разрывы строк: клип
  • Autoshrink: минимальный масштаб шрифта 0.25

Ответ 3

minimumFontSize устарел в iOS 6.

Поэтому используйте minimumScaleFactor вместо minmimumFontSize.

lbl.adjustsFontSizeToFitWidth=YES;
lbl.minimumScaleFactor=0.5;

Ответ 4

также мое решение - логическая метка. adjustsFontSizeToFitWidth = YES; НО. Вы должны в интерфейсе Builder установить Word Wrapping на " CLIP". Затем автозатемните ярлыки. Это очень важно.

Ответ 5

Вы можете написать как

UILabel *reviews = [[UILabel alloc]initWithFrame:CGRectMake(14, 13,270,30)];//Set frame
reviews.numberOfLines=0;
reviews.textAlignment = UITextAlignmentLeft;
reviews.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:12];
reviews.textColor=[UIColor colorWithRed:0.0/255.0 green:0.0/255.0 blue:0.0/255.0 alpha:0.8]; 
reviews.backgroundColor=[UIColor clearColor];

Вы можете рассчитать количество строк, подобных этому

CGSize maxlblSize = CGSizeMake(270,9999);
CGSize totalSize = [reviews.text sizeWithFont:reviews.font 
              constrainedToSize:maxlblSize lineBreakMode:reviews.lineBreakMode];

CGRect newFrame =reviews.frame;
newFrame.size.height = totalSize.height;
reviews.frame = newFrame;

CGFloat reviewlblheight = totalSize.height;

int lines=reviewlblheight/12;//12 is the font size of label

UILabel *lbl=[[UILabel alloc]init];
lbl.frame=CGRectMake(140,220 , 100, 25);//set frame as your requirement
lbl.font=[UIFont fontWithName:@"Arial" size:20];
[lbl setAutoresizingMask:UIViewContentModeScaleAspectFill];
[lbl setLineBreakMode:UILineBreakModeClip];
lbl.adjustsFontSizeToFitWidth=YES;//This is main for shrinking font
[email protected]"HelloHelloHello";

Надеюсь, это поможет вам:-) ожидание вашего ответа

Ответ 6

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

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

Я не понимаю, почему это так сложно реализовать. Если я что-то упустил, все могут исправить меня:)

Ответ 7

Это для Swift 3, выполняющего Xcode 8.2.1 (8C1002)

Лучшее решение, которое я нашел, - установить фиксированную ширину в вашей раскадровке или IB на этикетке. Установите ограничения с ограничениями на поля. В вашем представленииDidLoad добавьте следующие строки кода:

override func viewDidLoad() {
            super.viewDidLoad()

            label.numberOfLines = 1
            label.adjustsFontSizeToFitWidth = true
            label.minimumScaleFactor = 0.5
        }

ограничения метки для поля

ограничения метки метки фиксированной ширины для поля

инспектор атрибутов

Это работало как прелесть и не переполняется новой строкой и сжимает текст, чтобы он соответствовал ширине ярлыка без каких-либо странных проблем и работал в Swift 3.

Ответ 8

В Swift 3 (Programmatically) я должен был сделать это:

let lbl = UILabel()
lbl.numberOfLines = 0
lbl.lineBreakMode = .byClipping
lbl.adjustsFontSizeToFitWidth = true
lbl.minimumScaleFactor = 0.5
lbl.font = UIFont.systemFont(ofSize: 15)

Ответ 9

Я думаю, что вы можете написать ниже код после выделения init Label

UILabel* lbl = [[UILabel alloc]initWithFrame:CGRectMake(0, 10, 280, 50)];
lbl.text = @"vbdsbfdshfisdhfidshufidhsufhdsf dhdsfhdksbf hfsdh fksdfidsf sdfhsd fhdsf sdhfh sdifsdkf ksdhfkds fhdsf dsfkdsfkjdhsfkjdhskfjhsdk fdhsf ";
[lbl setMinimumFontSize:8.0];
[lbl setNumberOfLines:0];
[lbl setFont:[UIFont systemFontOfSize:10.0]];
lbl.lineBreakMode = UILineBreakModeWordWrap;
lbl.backgroundColor = [UIColor redColor];
[lbl sizeToFit];
[self.view addSubview:lbl];

Он работает со мной отлично. Используйте

Ответ 10

Два года спустя, и этот вопрос все еще вокруг...

В iOS 8/XCode 6.1 иногда я обнаружил, что мой UILabel (созданный в UITableViewCell, с включенным AutoLayout и гибкими ограничениями, поэтому у него было много места) не будет изменять размер, чтобы соответствовать текстовая строка.

Решение, как и в предыдущие годы, состояло в том, чтобы установить текст, а затем вызвать sizeToFit.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    . . .
    cell.lblCreatedAt.text = [note getCreatedDateAsString];
    [cell.lblCreatedAt sizeToFit];
}

(Вздох.)

Ответ 11

В iOS 9 мне просто пришлось:

  • Добавьте ограничения слева и справа от метки в супервизор.
  • Установите режим разрыва строки на обрезку в IB.
  • Задайте количество строк в 1 в IB.

Кто-то рекомендовал установить число строк в 0, но для меня это просто заставило метку перейти на несколько строк...

Ответ 12

Вот как это сделать. Предположим следующее сообщениеLabel - это метка, на которой вы хотите получить желаемый эффект. Теперь попробуйте простую строку кодов:

    //SET THE WIDTH CONSTRAINTS FOR LABEL.
    CGFloat constrainedWidth = 240.0f;//YOU CAN PUT YOUR DESIRED ONE,THE MAXIMUM WIDTH OF YOUR LABEL.
 //CALCULATE THE SPACE FOR THE TEXT SPECIFIED.
    CGSize sizeOfText=[yourText sizeWithFont:yourFont constrainedToSize:CGSizeMake(constrainedWidth, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];
    UILabel *messageLabel=[[UILabel alloc] initWithFrame:CGRectMake(20,20,constrainedWidth,sizeOfText.height)];
    messageLabel.text=yourText;
    messageLabel.numberOfLines=0;//JUST TO SUPPORT MULTILINING.

Ответ 13

не работает, если numberOfLines > 1 То, что я сделал, сделал такое условие -

if(lblRecLocation.text.length > 100)
    lblRecLocation.font = [UIFont fontWithName:@"app_font_name" size:10];

Ответ 14

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

label.numberOfLines = [labelString componentsSeparatedByString:@" "].count;

Apple Docs говорят:

Обычно текст метки нарисован шрифтом, указанным в свойстве шрифта. Если для этого свойства установлено значение "ДА", и текст в текстовом свойстве превышает ограничивающий прямоугольник меток, приемник начинает уменьшать размер шрифта до тех пор, пока строка не будет соответствовать или не будет достигнут минимальный размер шрифта. В iOS 6 и ранее это свойство действует только тогда, когда для свойства numberOfLines установлено значение 1.

Но это ложь. Ложь, которую я тебе скажу! Это верно для всех версий iOS. В частности, это верно при использовании UILabel в пределах UICollectionViewCell, для которого размер определяется ограничениями, динамически настраиваемыми во время выполнения через пользовательский макет (например, self.menuCollectionViewLayout.itemSize = size).

Поэтому при использовании в сочетании с adjustsFontSizeToFitWidth и minimumScaleFactor, как упоминалось в предыдущих ответах, программная установка numberOfLines на основе количества слов решила проблему автозапуска. Выполнение чего-то подобного, основанного на подсчете слов или даже количестве символов, может вызвать "достаточно близкое" решение.

Ответ 15

В Swift 4 (программно):

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200.0, height: 200.0))
label.adjustsFontSizeToFitWidth = true
label.numberOfLines = 0

label.text = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."

view.addSubview(label)