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

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

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

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

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

Ответы [ 17 ]

2 голосов
/ 20 февраля 2015

Прошло два года, и эта проблема все еще существует ...

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

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

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

(Вздох.)

1 голос
/ 28 июня 2012

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

if(lblRecLocation.text.length > 100)
    lblRecLocation.font = [UIFont fontWithName:@"app_font_name" size:10];
1 голос
/ 28 марта 2012

Вот как это сделать. Предположим, следующее сообщение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.
1 голос
/ 24 апреля 2018

В 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's 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)
1 голос
/ 12 сентября 2018

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

Font resizing animation

Легкого пути нет, но это определенно возможно.Один из способов сделать это - программно пробовать шрифты разных размеров, пока не найдете тот, который подходит достаточно близко к границам вида.Вы можете сделать это с помощью функции boundingRect(), равной NSString или NSAttributedString.Например:

let string = "This is a test"
let infiniteSize = CGSize(width: CGFloat.greatestFiniteMagnitude, height:CGFloat.greatestFiniteMagnitude)
let size = string.boundingRect(with: infiniteSize, options: [], attributes: [.font: UIFont.systemFont(ofSize: avgSize)] context: nil).size

Вы можете сделать бинарный поиск более эффективным, чем полный метод грубой силы.Есть также некоторые соображения, которые немного более сложны, в том числе правильная перенос слов и производительность кэширования шрифтов iOS, если вы ищете что-то действительно надежное.Проще говоря, я разработал надежную реализацию в Swift, которую я также использую в производственном приложении.Это подкласс UIView с эффективным автоматическим масштабированием шрифта для любого вводимого текста, включая несколько строк.Чтобы использовать его, вы просто должны сделать что-то вроде:

let view = AKTextView()
// Use a simple or fancy NSAttributedString
view.attributedText = .init(string: "Some text here")
// Add to the view hierarchy somewhere

Вот и все!Вы можете найти полный источник здесь: https://github.com/FlickType/AccessibilityKit

Надеюсь, это поможет!

0 голосов
/ 24 сентября 2018

Swift 4, Xcode 9.4.1

Решение, которое сработало для меня: У меня была метка в ячейке представления коллекции , и текст метки обрезался. Установите атрибуты, как показано ниже на раскадровке

Lines = 0
LineBreak = Word Wrap
Set yourlabel's leading and trailing constraint = 0 (using Autolayout)
0 голосов
/ 02 мая 2016

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

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

Документы Apple говорят:

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

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

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

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