Подтвердить что ты не робот

UITableView с динамическими высотами ячеек - что мне нужно сделать, чтобы исправить прокрутку?

Я создаю крошечный маленький клиент 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]), изменяя свойства в Interface Builder...

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

4b9b3361

Ответ 1

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

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

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