Вычисление высоты многострочного текста для UILabel/UITableViewCell: различные результаты при вычислении по сравнению с фактическим рисунком

Эту общую тему спросили здесь многократно: как представить UITableViewCells с переменной суммой текста и таким образом переменной высотой. Канонический ответ: Вы вычисляете высоту в делегате контроллера табличного представления в heightForRowAtIndexPath, использующем sizeWithFont:constrainedToSize:lineBreakMode:. Позже, ячейка оттянута, и Вы используете что-то как [маркируют sizeToFit] в случае необходимости, и все работы как волшебство.

Моя проблема: Я получаю обертывание для некоторых ячеек потому что sizeWithFont: возвращает различные размеры из фактического рисунка.

Определенный пример:

Текст - это: "Люди забывают, что @BillGates имел сексуальное 1/4-inch толстый большой список назад в 1993 от NEC. Что бы ни случилось эта неделя НЕ будет об аппаратных средствах!"

CGSize theSize = [text sizeWithFont:[UIFont systemFontOfSize:17.0f] constrainedToSize:CGSizeMake(310.0f, FLT_MAX) lineBreakMode:UILineBreakModeWordWrap];
NSLog(@"calculated size for %@: %f, %f",text, theSize.width, theSize.height);

Это возвращается: 306.000000, 84.000000. (Т.е. 4 строки со шрифтом на 17 пкс и 4 пкс linespacing, продвижением на 21 пкс.) Хороший.

Однако позже, на самом деле таща ячейку:

label = (UILabel *)[cell viewWithTag:3];
label.text = [NSString stringWithFormat:@"%@", text];
label.lineBreakMode = UILineBreakModeWordWrap;
label.font = [UIFont systemFontOfSize:17.0f];
CGSize labelSize;   
labelSize = label.frame.size;
NSLog(@"label size before resizing: %f, %f", labelSize.width, labelSize.height);
[label sizeToFit];
labelSize = label.frame.size;
NSLog(@"label size after resizing: %f, %f for text %@", labelSize.width, labelSize.height,text);

(UILabel загружается как часть UITableViewCell от NIB. В IB я установил его на 310 пкс шириной.)

Это должно возвратить точно тот же размер как выше. Вместо этого я добираюсь 281.000000, 105.000000 как размеры после sizeToFit вызов. Это - теперь 5 строк в рисовании времени вместо 4, и текст перетекает, я вижу избыток в UI.

Так, для того же текста я получаю два различных размера, вычисленные, и не могу понять это. Это - что-то о UILabel? Это имеет некоторые внутренние поля? Это продолжает происходить для некоторых текстов, но не других, и я не проследил его до чего-то конкретного о строках; кажется случайным. Эти выделения темы, что существует две передачи обработки: вычисление высоты по сравнению с фактическим рисунком. Это согласовывается с тем, что я вижу. Но я не понимаю то, что точно продолжается или как зафиксировать его.

Вопрос: почему я вижу два различных расчетных размера, и как я фиксирую его?

39
задан Community 23 May 2017 в 11:45
поделиться

1 ответ

Конечно, решение очевидно 30 секунд после публикации. Может быть, полезно для других ...

Размер SizeWithFont: был правильным. Размеры, которые я рассчитал вышеупомянутым образом, были неверны, потому что [этикетка Sizetofit] уменьшает ширину рамы этикетки. При последующих вызовах в тот же код он начал с кадром, который уже может быть уменьшен.

Исправление было просто сбросить кадру ширину к известной хорошей ширине перед размерами, чтобы соответствовать:

CGRect labelFrame = label.frame;
labelFrame.size.width = 310;
label.frame = labelFrame;
[label sizeToFit];
36
ответ дан 27 November 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: