У меня есть подкласс UITableViewCell, который имеет изображение, название и описание. Я должен изменить размер ячейки в соответствии с длиной содержимого описания, т. Е. Если он охватывает более 5 строк, я должен расширить его (+ другие подовые изображения, такие как изображение и т. Д.), Пока он не будет продолжаться.Как настроить пользовательский UITableViewCell с разной высотой
Следующие ближайшие ячейки должны начинаться только после этого.
У меня есть UITableViewCell подкласса экземпляр из XIb, который имеет фиксированную высоту строки = 160.
Я знаю, что это довольно стандартное требование, но я не могу найти какие-либо рекомендации.
I уже продлевал layoutSubViews, как это:
- (void) layoutSubviews
{
[self resizeCellImage];
}
- (void) resizeCellImage
{
CGRect descriptionRect = self.cellDescriptionLabel.frame;
CGRect imageRect = self.cellImageView.frame;
float descriptionBottomEdgeY = descriptionRect.origin.y + descriptionRect.size.height;
float imageBottomEdgeY = imageRect.origin.y + imageRect.size.height;
if (imageBottomEdgeY >= descriptionBottomEdgeY)
return;
//push the bottom of image to the bottom of description
imageBottomEdgeY = descriptionBottomEdgeY;
float newImageHeight = imageBottomEdgeY - imageRect.origin.y;
imageRect.size.height = newImageHeight;
self.cellImageView.frame = imageRect;
CGRect cellFrame = self.frame;
cellFrame.size.height = imageRect.size.height + imageRect.origin.y + 5;
CGRect contentFrame = self.contentView.frame;
contentFrame.size.height = cellFrame.size.height - 1;
self.contentView.frame = contentFrame;
self.frame = cellFrame;
}
Это в значительной степени говорит, что если описание выше изображения, мы должны изменить размер изображения, а также высоту ячейки, чтобы соответствовать описанию.
Однако, когда я вызываю этот код, как это сделать:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.cellDescriptionLabel.text = @"Some long string";
[cell.cellDescriptionLabel sizeToFit];
[cell setNeedsLayout];
return cell;
}
Оказывается, что в то время как клетки кадра изменяется из-за layoutSubViews
вызова, другие клетки не уважают его. То есть, они появляются в том же положении, если предыдущая ячейка не изменила бы сама по себе.
Два вопроса:
- Как сделать возможным то, что я хочу?
- Имею ли я право по телефону
setNeedsLayout
в пределахcellForRowAtIndexPath
?
P.S .: Я знаю, что heightForRowAtIndexPath
имеет ключевое значение для изменения высоты ячейки, но я чувствую, что данные синтаксический анализ (не показанные здесь), что я делаю, как часть cellForRowAtIndexPath
были бы излишество просто вычислить высоту. Мне нужно что-то, что может прямо сообщить UITableViewCell
, чтобы изменить размер в соответствии с потребностями контента.
Вы можете выполнить синтаксический анализ данных в 'heightForRowAtIndexPath', а затем повторно использовать его в' cellForRowAtIndexPath'. – nemesis
Хорошая мысль, однако должен быть способ сказать самой ячейке, что вот содержание для вас, и вы сами изменяете размер, что и происходит в cellForRowAtIndexPath - правильный способ чтения в ячейку. Я знаю, что есть способы, но мне просто нужно это открыть. –
Хотел бы я помочь, но на самом деле я понятия не имею. Но я бы хотел увидеть ответ, когда вы его решаете, так что, удачи! :) – nemesis