sizeToFit не запускает новую строку с длинными словами

Я только что столкнулся со странной проблемой, у меня есть пользовательская ячейка таблицы с динамической высотой. Во время тестирования все это, казалось, работало нормально, но теперь, когда я загружаю в него реальный контент, кажутся некоторые проблемы.

Похоже, что некоторый текст не запускает новую строку в UILabel

Правильно: http://dl.dropbox.com/u/274185/Screen%20Shot%202012-05-09%20at%201.15.21%20PM.png Неверно: http://dl.dropbox.com/u/274185/Screen%20Shot%202012-05-09%20at%201.15.30%20PM.png

Как вы можете видеть в неправильном примере, текст выталкивается на вторую строку, но высота метки по-прежнему составляет только одну строку.

item.project = @Другой тестовый проект с более длинным заголовком (Администрирование/Управление проектами);

item.project = @Test Project (Администрирование/Управление проектами);

Как я вычисляю высоту, так:

// when creating the cell
cell.projectLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.projectLabel.numberOfLines = 0;
[cell.projectLabel sizeToFit];

// in heightForRowAtIndexPath()
CGSize projectHeight = [item.project sizeWithFont:[UIFont boldSystemFontOfSize:13.0f] constrainedToSize:CGSizeMake(320.0f, CGFLOAT_MAX) lineBreakMode: UILineBreakModeWordWrap];

Я попытался изменить lineBreakMode, но это, похоже, не очень помогает.

РЕДАКТИРОВАТЬ: возникла проблема при расчете высоты текста, я использовал фиксированные 320 точек, что неверно, после использования фактической ширины высота была рассчитана правильно.

CGSize projectHeight = [item.project sizeWithFont:[UIFont boldSystemFontOfSize:13.0f] constrainedToSize:CGSizeMake(cell.projectLabel.bounds.size.width, CGFLOAT_MAX) lineBreakMode: UILineBreakModeWordWrap];

person woutr_be    schedule 09.05.2012    source источник


Ответы (1)


Я полагаю, что sizeToFit только уменьшает представление. Вы должны установить рамку вашей этикетки так, чтобы она была достаточно высокой для двух строк, а затем вызвать sizeToFit. Это уменьшит метку, когда текст состоит только из одной строки, но сохранит ее высоту, если текст состоит из двух строк.

person David Rönnqvist    schedule 09.05.2012
comment
В Interface Builder рамка моей метки достаточно высока, чтобы вместить несколько строк. Но, как вы можете видеть на скриншоте, это происходит только в некоторых случаях, что заставляет меня думать, что это как-то связано с lineBreakMode. - person woutr_be; 09.05.2012
comment
Проверьте UILineBreakModeCharacterWrap, чтобы убедиться, что это правда - person David Rönnqvist; 09.05.2012
comment
Та же проблема, когда я вывожу высоту, она дает 32 пикселя для первого, а другой дает только 16 пикселей. Странный... - person woutr_be; 09.05.2012
comment
Это высота метки или высота строки? Какова высота строки по сравнению с высотой метки? - person David Rönnqvist; 09.05.2012
comment
Высота строки динамическая, например в строке последнего скриншота строка 131px, метка 16px, на первом скриншоте строка 189px и метка 32px. - person woutr_be; 09.05.2012
comment
Возникла проблема при расчете высоты текста, я использовал фиксированные 320 точек, что неверно, после использования фактической ширины высота была рассчитана правильно. CGSize projectHeight = [item.project sizeWithFont: [UIFont boldSystemFontOfSize: 13.0f] constrainedToSize: CGSizeMake (cell.projectLabel.bounds.size.width, CGFLOAT_MAX) lineBreakMode: UILineBreakModeWordWrap]; - person woutr_be; 09.05.2012
comment
Это произошло, потому что высота текста была рассчитана на основе текста, а не фактической метки. - person woutr_be; 09.05.2012