UILabel не автоматически сжимает текст, чтобы соответствовать размеру этикетки - PullRequest
106 голосов
/ 28 марта 2012

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

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

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

РЕДАКТИРОВАТЬ: UILabel минимальный размер шрифта установлен на 10

Ответы [ 17 ]

150 голосов
/ 17 октября 2012

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

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

@property(nonatomic) BOOL adjustsFontSizeToFitWidth

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

@property(nonatomic) BOOL adjustsLetterSpacingToFitWidth

Источник .

112 голосов
/ 15 декабря 2015

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

enter image description here

  • Количество строк 0
  • Разрывы строк: клип
  • Автоусадка: минимальный масштаб шрифта 0,25
66 голосов
/ 17 сентября 2013

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

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

lbl.adjustsFontSizeToFitWidth=YES;
lbl.minimumScaleFactor=0.5;
19 голосов
/ 25 июня 2014

также мое решение - логическое label.adjustsFontSizeToFitWidth = YES;НО.В интерфейсе Builder необходимо установить переключатель «Обтекание словом» на « CLIP ».Затем автоматически сожмите ярлыки.Это очень важно.

8 голосов
/ 09 марта 2017

В Swift 3 (программно) мне нужно было сделать это:

let lbl = UILabel()
lbl.numberOfLines = 0
lbl.lineBreakMode = .byClipping
lbl.adjustsFontSizeToFitWidth = true
lbl.minimumScaleFactor = 0.5
lbl.font = UIFont.systemFont(ofSize: 15)
5 голосов
/ 29 марта 2012

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

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
lbl.text=@"HelloHelloHello";

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

4 голосов
/ 05 марта 2017

Это для Swift 3 с запущенным Xcode 8.2.1 (8C1002)

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

override func viewDidLoad() {
            super.viewDidLoad()

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

label constraints to margin

fixed width label constraints to margin

attributes inspector

Это работает как талисман, не перетекает на новую строку и сжимает текст до ширины метки без каких-либо странных проблем и работает в Swift 3.

3 голосов
/ 08 августа 2012

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

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

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

2 голосов
/ 08 марта 2016

В iOS 9 мне просто нужно было:

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

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

2 голосов
/ 28 марта 2012

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

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

Работает со мной нормально Используй это

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