Мой вопрос по существу сводится к наилучшему способу поддержки динамических высот UILabel (и, я полагаю, других элементов) в UITableCell, а также правильно изменить размер/высоту и высоту метки высоты при вращении.
Я знаю, как получить ожидаемую высоту UILabels, и, соответственно, размер высоты, но кажется, что вы слишком сложны, когда поддерживаете ландшафтную ориентацию.
Я думаю, что это может пойти по пути layoutSubviews, но я не уверен, как вы могли бы объединить это с таблицей, необходимой для вычисления высоты ячеек, Еще один интересный пост устанавливает фрейм вручную на init, чтобы убедиться, что он выполняет вычисления с известной величины, но это касается только части проблемы.
Итак, вот образ того, с чем я имею дело, с красными стрелками, указывающими на ярлыки динамической высоты, и синие стрелки, указывающие на ячейки, которые будут изменять высоту.
Мне удалось заставить его работать правильно, но не уверен, что его правильный метод.
Вот несколько вещей, которые я узнал:
- Элемент cell.frame в
cellForRowAtIndexPath
всегда дает свой размер в портретном режиме. (т.е. для приложения iphone, он всегда сообщает 320). - Сохранение ячейки прототипа для ссылки в свойстве имеет ту же проблему, всегда в портретном режиме
- Авторезистирующие маски для ширины меток кажутся бесполезными в этом прецеденте и фактически вызывают проблемы с расчетной высотой при вращении
- Таблица table.frame в
cellForRowAtIndexPath
дает размер в правильной ориентации - Вам нужно вызвать
[tableView reloadData]
при вращении. Я не мог найти другого способа обновить высоты ячеек и ярлыков.
Вот шаги, которые я предпринял, чтобы заставить это работать для меня:
- Отключите любые маски autoresize на UILabels, так как они по какой-то причине мешают получить правильную высоту метки.
-
В
viewDidLoad
Я беру ссылку на каждый шрифт метки и поплавок для процента ширины метки по сравнению с табличным изображением в портретеCWProductDetailDescriptionCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"DescriptionCell"]; self.descriptionLabelWidthPercentage = cell.descriptionLabel.frame.size.width / 320; self.descriptionLabelFont = cell.descriptionLabel.font;
-
В
heightForRowAtIndexPath
Я вычисляю высоту ячейки, используя ширину tableView и процент, который я уже захватил:case TableSectionDescription: CGFloat labelWidth = self.tableView.frame.size.width * self.descriptionLabelWidthPercentage; CGSize newLabelFrameSize = [self sizeForString:self.product.descriptionText WithConstraint:CGSizeMake(labelWidth, MAXFLOAT) AndFont:self.descriptionLabelFont]; return newLabelFrameSize.height + kTextCellPadding;
-
В
cellForRowAtIndexPath
Я вычисляю фрейм для фрейма метки и обновляю егоcell = [tableView dequeueReusableCellWithIdentifier:@"DescriptionCell"]; ((CWProductDetailDescriptionCell *)cell).descriptionLabel.text = self.product.descriptionText; CGRect oldFrame = ((CWProductDetailDescriptionCell *)cell).descriptionLabel.frame; CGFloat labelWidth = self.tableView.frame.size.width * self.descriptionLabelWidthPercentage; CGSize newLabelFrameSize = [self sizeForString:self.product.descriptionText WithConstraint:CGSizeMake(labelWidth, MAXFLOAT) AndFont:((CWProductDetailDescriptionCell *)cell).descriptionLabel.font]; ((CWProductDetailDescriptionCell *)cell).descriptionLabel.frame = CGRectMake(oldFrame.origin.x, oldFrame.origin.y, labelWidth, newLabelFrameSize.height);
-
В
didRotateFromInterfaceOrientation
вам нужно[self.tableView reloadData]
Проблемы с этим методом:
- Вы не можете использовать авторезистирующие маски и поля, которые вы могут быть установлены в IB
- Если ваша ширина ярлыка не равна проценту в портрет и пейзаж, вам нужно знать оба процента.
- Вам нужно знать/рассчитать процентные доли ваших меток. В идеале вы сможете рассчитать их на лету после того, как маска с автоматическим изменением сделана.
- Это просто неудобно. У меня есть чувство, что я столкнусь с болью в режиме редактирования с отступом.
Так. Каков правильный способ сделать это? Я видел много вопросов SO, но никто этого не делает.