UITableView с динамической высотой ячеек - что мне нужно сделать, чтобы исправить прокрутку вниз? - PullRequest
19 голосов
/ 25 марта 2009

Я создаю крошечный маленький Twitter-клиент на iPhone. Естественно, я отображаю твиты в UITableView, и они, конечно, различной длины. Я динамически меняю высоту ячейки на основе текста довольно хорошо:

- (CGFloat)heightForTweetCellWithString:(NSString *)text {
  CGFloat height = Buffer + [text sizeWithFont:Font constrainedToSize:Size lineBreakMode:LineBreakMode].height;
  return MAX(height, MinHeight);
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  NSString *text = // get tweet text for this indexpath
    return [self heightForTweetCellWithString:text];
  }
}

Я отображаю фактическую ячейку твита, используя алгоритм из книги PragProg:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  static NSString *CellIdentifier = @"TweetCell";
  TweetCell *cell = (TweetCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) {
    cell = [self createNewTweetCellFromNib];
  }
  cell.tweet.text = // tweet text
  // set other labels, etc
  return cell;
}

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

Вот видео, которое показывает это в действии: http://screencast.com/t/rqwD9tpdltd

Я уже немного попробовал: изменение размера рамки ячейки при создании, использование разных идентификаторов для ячеек с разной высотой (т. Е. [NSString stringWithFormat:@"Identifier%d", rowHeight]), изменение свойств в Интерфейсном Разработчике ...

Если есть дополнительные фрагменты кода, которые я могу опубликовать, пожалуйста, дайте мне знать. Заранее спасибо за помощь!

1 Ответ

8 голосов
/ 25 марта 2009

Вздох. Оказывается, я не достаточно хорошо настроил все свойства. Но, по крайней мере, я избавился от этой ошибки. :)

Это поведение было исправлено проверкой "Clip Subviews" свойства UITableViewCell.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...