UILabel и numberOfLines и sizeToFit:
На iOS 5.
У меня есть элемент UILabel, который изначально помещен в перо. Я хочу, чтобы место размещения х оставалось неизменным. Я хочу, чтобы он занимал либо 1 строку, либо 2 строки. Если больше двух строк, следует использовать настройку разрыва строки, чтобы показать многоточие.
я использую numberOfLines
собственность и -sizeToFit
Если я установлю UILabel's numberOfLines
свойство 0, он будет правильно видеть, что для некоторого текста недостаточно места, и перенесет его на вторую строку после вызова -sizeToFit
но в редком случае, когда строка достаточно длинная, чтобы растянуть до 3 строк, я получаю три строки, которые мне не нужны. Если я установлю numberOfLines
свойство до 2, оно фактически растягивает все это на одну строку и удлиняет мой начальный набор кадров в кончике, чтобы быть намного шире.
CGRect titleFrame = [[self titleLabel] frame];
[[self titleLabel] setNumberOfLines:0];
[[self titleLabel] setText:newProductTitleText];
[[self titleLabel] sizeToFit];
CGRect newTitleFrame = [[self titleLabel] frame];
CGRect только для меня, чтобы иметь возможность рассчитывать вещи после факта. Итак, постановка numberOfLines
до 0 работает, и не изменит исходный origin.x во фрейме, и разбит длинный текст на несколько строк, но не ограничит его до 2 строк. настройка numberOfLines
свойство до 2, которое, когда я читаю документы Apple
Это свойство контролирует максимальное количество строк, чтобы использовать, чтобы поместить текст метки в ограничивающий прямоугольник. Значением по умолчанию для этого свойства является 1. Чтобы удалить любой максимальный предел и использовать столько строк, сколько необходимо, установите для этого свойства значение 0.
Кажется, я смогу установить это на два и все еще работать. Я бы ожидал sizeToFit
расширяться в положительном направлении X и Y при расширении, чтобы вместить весь текст, но расширяется в отрицательном направлении X, когда numberOfLines
установлен в отличное от 0.
ETA: стойки "Autosize" устанавливаются в верхнее и левое положение, чтобы зафиксировать их как минимум x, y.
Спасибо за понимание.
2 ответа
Я использовал свойство UIFont lineHeight:
CGFloat labelHeight = label.font.lineHeight*label.numberOfLines;
У меня была похожая проблема где -[UILabel sizeToFit]
не соблюдая максимальную ширину, которую я установил, когда numberOfLines
было установлено на 2. Вот как я решил эту проблему:
CGFloat titleMaxWidth = 200;
CGFloat titleMinHeight = 30;
CGFloat titleMaxHeight = 40;
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 5, titleMaxWidth, titleMaxHeight)]; // alternatively, you could do this in a nib
titleLabel.numberOfLines = 0;
titleLabel.text = @"The title label will be sized appropriately with this technique.";
titleLabel.font = [UIFont boldSystemFontOfSize:16];
[titleLabel sizeToFit];
titleLabel.numberOfLines = 2;
if (titleLabel.height > titleMaxHeight)
{
titleLabel.height = titleMaxHeight;
}
else if (titleLabel.height < titleMinHeight)
{
titleLabel.height = titleMinHeight;
}
Как видите, я также хотел минимальную высоту для моей этикетки, так как -sizeToFit
часто делает метку очень маленькой, но вы можете игнорировать этот код, если вам не нужна минимальная высота. "Магическое число" 40 для titleMaxHeight получено в результате экспериментов и выяснения, что для двухстрочной метки с этим шрифтом действительно требуется всего 40 пикселей. В этом коде -sizeToFit
в основном используется для удержания текста в пределах ширины и определения того, можно ли уменьшить начальную высоту 40, когда у нас есть короткая строка текста.