Мой вопрос по существу сводится к лучшему способу поддержки динамической высоты UILabel (, и я полагаю, что другие элементы )в UITableCell , а также правильно изменяют размер ширины/высоты метки и ячейки высоты при вращении .
Я знаю, как получить ожидаемую высоту UILabels и соответственно изменить размер высоты, но все становится довольно сложно, когда вы также поддерживаете альбомную ориентацию.
Я думаю, что это может пойти по пути layoutSubviews , но я не уверен, как вы могли бы объединить это с таблицей, требующей вычисления высоты ячеек. В другом интересном посте фрейм устанавливается вручную при инициализации, чтобы убедиться, что они выполняют расчеты по известной величине, но это решает только часть проблемы.
Итак, вот изображение того, с чем я имею дело, с красными стрелками, указывающими на метки динамической высоты, и синими стрелками, указывающими на ячейки, высота которых будет изменяться.
Мне удалось заставить его работать правильно, но я не уверен, что это правильный метод.
cellForRowAtIndexPath
всегда указывает свой размер в портретном режиме. (т.е. для приложения iphone оно всегда сообщает 320 ).cellForRowAtIndexPath
дает свой размер в правильной ориентации[tableView reloadData]
по очереди.Я не смог найти другого способа обновить высоту ячеек и меток. В viewDidLoad
я беру ссылку на каждый шрифт метки и число с плавающей запятой для процента ширины метки по сравнению с tableView в портретной ориентации
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]
Так. Как правильно это сделать? Я видел много вопросов SO, но ни один из них не касается этого точно.