UILabel и numberOfLines и sizeToFit:

На iOS 5.

У меня есть элемент UILabel, который изначально помещен в наконечник. Я хочу, чтобы размещение x оставалось фиксированным. Я хочу, чтобы он занимал либо 1 строку, либо 2 строки. Если более двух строк, следует использовать настройку разрыва строки, чтобы показать многоточие.

Я использую свойство numberOfLines и -sizeToFit

Если я установлю для свойства UILabel 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 в фрейме и разобьет длинный текст на несколько строк, но не ограничит его двумя строками. Установка свойства numberOfLines на 2, что, когда я прочитал документы Apple

Это свойство управляет максимальным количеством строк, используемых для размещения текста метки в ограничивающем его прямоугольнике. Значение по умолчанию для этого свойства равно 1. Чтобы снять максимальное ограничение и использовать столько строк, сколько необходимо, установите для этого свойства значение 0.

Кажется, я должен установить это значение на два, и оно все еще будет работать. Я бы ожидал, что sizeToFit будет расширяться в положительном направлении X и Y при расширении, чтобы уместить весь текст, но он расширяется в отрицательном направлении X, когда numberOfLines установлено на значение, отличное от 0.

ETA: стойки «Autosize» установлены на верх и оставлены, чтобы зафиксировать их на мин. x, y.

Спасибо за любое понимание.


person chadbag    schedule 08.09.2012    source источник
comment
Я думаю, что этот поток может помочь stackoverflow.com/questions/5041874/   -  person Gia Dang    schedule 09.12.2012
comment
Это старый вопрос и, вероятно, не относящийся к текущей версии iOS, но я не понимаю, как это дублируется. Я прочитал вопрос, в котором утверждается, что это дубликат, и это другой вопрос. Этот спрашивает об отрицательном X, установленном -sizeToFit, а не о вертикальном выравнивании текста в UILabel.   -  person chadbag    schedule 27.05.2014


Ответы (2)


У меня была аналогичная проблема, когда -[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 появилось в результате экспериментов и выяснения того, что для 2-строчной метки с этим шрифтом на самом деле требуется всего 40 пикселей. В этом коде -sizeToFit в основном используется для того, чтобы удерживать текст в пределах ширины и определять, можно ли уменьшить начальную высоту 40, когда у нас есть короткая строка текста.

person Josh Brown    schedule 15.03.2013

Я использовал свойство lineHeight UIFont:

CGFloat labelHeight = label.font.lineHeight*label.numberOfLines;
person Dmitry Ryumin    schedule 05.09.2013