Эту общую тему спросили здесь многократно: как представить 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? Это имеет некоторые внутренние поля? Это продолжает происходить для некоторых текстов, но не других, и я не проследил его до чего-то конкретного о строках; кажется случайным. Эти выделения темы, что существует две передачи обработки: вычисление высоты по сравнению с фактическим рисунком. Это согласовывается с тем, что я вижу. Но я не понимаю то, что точно продолжается или как зафиксировать его.
Вопрос: почему я вижу два различных расчетных размера, и как я фиксирую его?
Конечно, решение очевидно 30 секунд после публикации. Может быть, полезно для других ...
Размер SizeWithFont:
был правильным. Размеры, которые я рассчитал вышеупомянутым образом, были неверны, потому что [этикетка Sizetofit]
уменьшает ширину рамы этикетки. При последующих вызовах в тот же код он начал с кадром, который уже может быть уменьшен.
Исправление было просто сбросить кадру ширину
к известной хорошей ширине перед размерами, чтобы соответствовать:
CGRect labelFrame = label.frame;
labelFrame.size.width = 310;
label.frame = labelFrame;
[label sizeToFit];