heightForRowAtIndexPath с пользовательской ячейкой и меткой

Если я создаю пользовательский UITableViewCell и мне нужно, чтобы он имел переменную высоту в зависимости от длины ввода (например, для чтения Twitter или чего-то еще), как я могу заставить это работать?

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

Существует ли стандартизированный способ проектирования ячейки (например, какой высоты я должен сделать ее в Interface Builder?), и, скажем, моя метка составляет половину ширины этой ячейки... как мне рассчитать высоту ячейки? нужно отображать строку, загруженную в эту метку? Вот метод, который я нашел здесь, который отлично работает в обычной ячейке, но портит пользовательские ячейки со странной высотой, перекрывающимся текстом и т. д.: буду тоже благодарен!)

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    CGSize  textSize = {300.f, 200000.0f};
    CGSize  size = [[_quoteStringsFromPlist objectAtIndex: indexPath.row] sizeWithFont: [UIFont systemFontOfSize:12.0f] constrainedToSize: textSize lineBreakMode: NSLineBreakByWordWrapping];
    size.height += 5.0f;
    float result = MAX(size.height, 32.0f);
    return result;
}

person Luke    schedule 15.02.2013    source источник
comment
Вы можете сделать все это в конструкторе интерфейсов (если вас это устраивает). В IB выберите представление таблицы и измените высоту строки. Затем выберите ячейку и выберите пользовательскую высоту ячейки и введите тот же номер. Надеюсь, поможет!   -  person Groot    schedule 15.02.2013
comment
Боюсь, это не сработало. Ячейки кажутся на разной высоте, но у коротких есть много места над/под ними, а более длинные обрезаются. Я установил высоту строки на 90 в обоих местах.   -  person Luke    schedule 15.02.2013


Ответы (2)


Что-то вроде этого должно работать.

CGRect labelFrame = // enter default frame of the label here
UIFont *labelFont = // enter label font here
CGFloat labelBottomMargin = // enter the space between the bottom of the label and the bottom of the cell here

CGSize  size = [labelString sizeWithFont:labelFont constrainedToSize:CGSizeMake(labelFrame.size.width, MAX_FLOAT)];
size.height += labeFrame.origin.y;
size.height += labelBottomMargin;
size.height = MAX(size.height, 32.0f);
return size.height;
person user941868    schedule 15.02.2013
comment
Это делает их всех НАМНОГО слишком высокими, более чем в два раза выше, чем они должны быть. - person Luke; 15.02.2013
comment
Кроме того, откуда 32.0f? - person Luke; 18.02.2013
comment
Это исходит от вас. Из вашего исходного кода я предположил, что 32.0f была минимальной высотой, которую вы хотели для своей ячейки. Предоставленный мной код должен работать, если вы ввели правильные значения для labelFrame, labelBottomMargin и labelFont. - person user941868; 20.02.2013

Во-первых, перейдите к своему xib-файлу и посмотрите, насколько велики верхнее/нижнее поля вашей текстовой области и насколько она широка.

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

Результат должен выглядеть корректно независимо от размера каждой ячейки в ИБ или текста, который вы пытаетесь в них поместить.

ИЗМЕНИТЬ

Представьте, что размер вашей ячейки составляет {700, 300} в вашем IB, а ваша текстовая область расположена на {{100, 100}, {300,100}}, ваша текстовая область имеет верхнее поле 100 пикселей и бот поля 100 пикселей, а его ширина составляет 300.

Когда вы вычисляете высоту, необходимую для вашего текста, вы рассчитываете ее с доступной шириной 300. Он вернет размер, например {300, 250}. Эти 250 — это высота, необходимая для вашего текста, но в вашей ячейке есть другие вещи, и вам нужно добавить к этому верхнее и нижнее поля, поэтому результат равен 450.

Не забудьте установить маску автоматического изменения размера или автомакет, чтобы ваша текстовая область растягивалась по вертикали, а поля были фиксированными (UIViewAutoresizingFlexibleHeight)

person Ismael    schedule 15.02.2013
comment
Не могли бы вы привести пример? Я вообще за этим не слежу. Моя текстовая область в раскадровке имеет ширину 159 и высоту 74 (по X 234 и Y 45, если это имеет значение). Я не уверен, что вы имеете в виду под маржей. - person Luke; 15.02.2013
comment
как называется свойство для текстовых полей? - person AlexWien; 15.02.2013
comment
Я вообще не знаю, что такое маски автоматического изменения размера. Мне жаль, что это проблема, но я до сих пор не понимаю, что вы подразумеваете под этим ответом. - person Luke; 15.02.2013
comment
Итак, проблема, с которой я сталкиваюсь, заключается в том, что размеры ячеек изменяются, но у больших есть большие поля, а у меньших почти нет полей. - person Luke; 16.02.2013