UILabel - метка авторазмера для текста?
Возможно ли автоматическое изменение размера поля UILabel/границ для соответствия содержащемуся тексту?
(Меня не волнует, если он окажется больше, чем дисплей)
Итак, если пользователь вводит "привет" или "мое имя действительно длинное, я хочу, чтобы оно входило в это поле", оно никогда не усекается и метка "расширена" соответственно?
Ответы
Ответ 1
Пожалуйста, проверьте мой gist, где я сделал категорию для UILabel
для чего-то очень похожего, моя категория позволяет UILabel
растянуть ее высоту, чтобы показать весь контент: https://gist.github.com/1005520
Или зарегистрируйтесь в этом сообщении: fooobar.com/questions/6054/...
Это будет растягивать высоту, но вы можете легко изменить его, чтобы работать другим способом и растянуть ширину с чем-то подобным, что я считаю тем, что вы хотите сделать:
@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, структура изменит размер вашей метки соответствующим образом (добавив больше высоты) в соответствии с вашим текстом.
Ответ 2
Использование [label sizeToFit];
приведет к такому же результату в категории Daniels.
Хотя я рекомендую использовать автозапуск и дайте ярлыку изменить размер на основе ограничений.
Ответ 3
Если мы хотим, чтобы UILabel
должен сокращаться и расширяться в зависимости от размера текста, лучше всего использовать раскадровку с автозапуском. Ниже приведены шаги для достижения этого
Действия
-
Поместите UILabel в контроллер и поместите его туда, где хотите. Также поставьте 0
для свойства numberOfLines
UILabel
.
-
Дайте ограничение на верхнее, ведущее и трейлинг-пространство.
- Теперь он будет предупреждать, нажмите желтую стрелку.
- Нажмите
Update Frame
и нажмите Fix Misplacement
. Теперь этот UILabel будет сокращаться, если текст будет меньше и будет расширяться, если текст больше.
Ответ 4
Это не так сложно, как это делают некоторые другие ответы.
Подключите левый и верхний края
Просто используйте автоматический макет, чтобы добавить ограничения, чтобы прикрепить левую и верхнюю стороны метки.
После этого он автоматически изменит размер.
Примечания
- Не добавляйте ограничения для ширины и высоты. Ярлыки имеют внутренний размер, основанный на их текстовом содержимом.
- Спасибо за этот ответ за помощью.
-
При использовании автоматического макета не нужно устанавливать 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
, то см. этот ответ.
Ответ 5
Используйте [label sizeToFit];
для настройки текста в UILabel
Ответ 6
Я создал несколько методов, основанных на Даниэле, выше.
-(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];
}
Ответ 7
@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.
Ответ 8
Вы можете поместить свой ярлык в соответствии с текстом и другими связанными элементами управления двумя способами -
до 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
//после этого вы можете получить рамку метки, чтобы перерисовать другие связанные элементы управления
Ответ 9
- Добавьте отсутствующие ограничения в раскадровку.
- Выберите UILabel в раскадровке и установите для атрибутов "Линия" значение 0.
- Ref Вывести UILabel на Controller.h с идентификатором: label
- Controller.m и добавить
[label sizeToFit];
в viewDidLoad
Ответ 10
У меня возникли огромные проблемы с автоматической компоновкой.
У нас есть два контейнера внутри ячейки таблицы. Второй контейнер изменяется в зависимости от описания товара (0 - 1000 символов), а строка должна быть изменена на основе их размеров.
Недопустимый ингредиент был нижним ограничением для описания.
Я изменил нижнее ограничение динамического элемента от = 0 до >= 0.
Ответ 11
Подходит каждый раз!:)
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];
Ответ 12
вы можете показать один вывод строки, затем установить свойство Линия = 0 и показать несколько строк, а затем установить свойство Линия = 1 и более
[self.yourLableName sizeToFit];
Ответ 13
Существует также такой подход:
[self.myLabel changeTextWithAutoHeight:self.myStringToAssignToLabel width:180.0f];