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, когда у нас есть короткая строка текста.

Другие вопросы по тегам