UILabel - метка авторазмера под текст?
Можно ли автоматически изменить размер поля / границ UILabel, чтобы оно соответствовало содержанию текста? (Мне все равно, если он окажется больше, чем дисплей)
Так что, если пользователь вводит "привет" или "мое имя действительно длинное, я хочу, чтобы оно вписывалось в это поле", оно никогда не будет усечено, а метка соответственно "расширена"?
15 ответов
Пожалуйста, проверьте мою суть, где я сделал категорию для UILabel
для чего-то очень похожего, моя категория позволяет UILabel
увеличьте его высоту, чтобы показать весь контент: https://gist.github.com/1005520
Или проверить этот пост: /questions/21202682/izmenenie-razmera-uilabel-v-zavisimosti-ot-soderzhimogo/21202692#21202692
Это увеличило бы высоту, но вы можете легко изменить ее, чтобы работать по-другому, и растянуть ширину примерно так: я верю, что вы хотите сделать:
@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;
}
С помощью [label sizeToFit];
достигнет того же результата из категории Дэниелс.
Хотя я рекомендую использовать autolayout и позволить метке самостоятельно изменять размер в зависимости от ограничений.
Если мы хотим этого UILabel
следует уменьшать и расширять в зависимости от размера текста, тогда раскадровка с автопоставкой является лучшим вариантом. Ниже приведены шаги для достижения этой цели.
меры
Поместите UILabel в поле зрения контроллера и разместите его там, где вы хотите. Также положить
0
заnumberOfLines
собственностьюUILabel
,Дайте ему ограничение Top, Leading и Trailing space.
- Теперь он выдаст предупреждение. Нажмите на желтую стрелку.
- Нажмите на
Update Frame
и нажмите наFix Misplacement
, Теперь эта UILabel будет уменьшаться, если текст меньше, и расширяется, если текст больше.
Это не так сложно, как делают некоторые другие ответы.
Прикрепите левый и верхний края
Просто используйте автоматический макет, чтобы добавить ограничения, чтобы закрепить левую и верхнюю стороны надписи.
После этого он автоматически изменит размер.
Заметки
- Не добавляйте ограничения для ширины и высоты. Ярлыки имеют собственный размер в зависимости от их текстового содержимого.
- Спасибо за этот ответ за помощь с этим.
Не нужно устанавливать
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
в коде. (Я также прикрепил кнопку к нижней части этикетки, чтобы она могла двигаться вниз при увеличении высоты этикетки.)
- Если вы ищете для динамического размера меток внутри
UITableViewCell
тогда посмотрите этот ответ.
Вот что я нахожу работы для моей ситуации:
1) Высота UILabel имеет ограничение>= 0, используя autolayout. Ширина фиксирована. 2) Назначьте текст в UILabel, у которого уже есть супервизия на данный момент (не уверен, насколько это важно). 3) Затем выполните:
label.sizeToFit()
label.layoutIfNeeded()
Высота метки теперь установлена соответствующим образом.
Я создал несколько методов, основанных на ответе Даниила выше.
-(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];
}
Вы можете изменить размер этикетки в соответствии с текстом и другими элементами управления, используя два способа:
Для 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;
Если вы не хотите вычислять размер текста метки, вы можете использовать -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
// после этого вы можете получить рамку метки для перефразирования других связанных элементов управления
@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.
метод sizeToFit() плохо работает с ограничениями, но в iOS 9 это все, что вам нужно —
label.widthAnchor.constraint(equalToConstant: label.intrinsicContentSize.width).activate()
- Добавьте недостающие ограничения в раскадровку.
- Выберите UILabel в раскадровке и установите атрибуты "Линия" на 0.
- Перевести UILabel в Controller.h с идентификатором: label
- Controller.m и добавить
[label sizeToFit];
в viewDidLoad
У меня были огромные проблемы с авторазборкой. У нас есть два контейнера внутри ячейки таблицы. Размер второго контейнера изменяется в зависимости от описания элемента (0 - 1000 символов), и размер строки должен изменяться в зависимости от них.
Недостающий ингредиент был нижним ограничением для описания.
Я изменил нижнее ограничение динамического элемента с = 0 на > = 0.
Подходит каждый раз!:)
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];
Вы можете показать вывод одной строки, затем установить свойство Line=0 и показать вывод нескольких строк, затем установить свойство Line=1 и более
[self.yourLableName sizeToFit];
Также есть такой подход:
[self.myLabel changeTextWithAutoHeight:self.myStringToAssignToLabel width:180.0f];