Сброс пользовательской высоты UITableViewCell при повороте iPhone - PullRequest
5 голосов
/ 16 мая 2009

Я перегружаю метод делегата -tableView:heightForRowAtIndexPath: и использую -sizeWithFont:constrainedToSize:, чтобы программно установить высоту ячейки, основываясь на тексте в этой ячейке:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  switch (indexPath.section) {
    case(kAboutViewOverviewSection): {
      switch (indexPath.row) {
        case(kAboutViewOverviewSectionRow): {
          NSString *text = NSLocalizedString(@"kAboutViewOverviewSectionFieldText", @"");
          CGSize s = [text sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(280, 500)];
          return s.height + 13;
        }
        default: {
          break;
        }
      }
      break;
    }
    default: {
      break;
    }
  }
  return 44.0;
}

Это работает, когда таблица впервые нарисована. Однако при изменении ориентации устройства с книжного на альбомный высота ячейки не изменяется.

Я попытался переопределить метод -shouldAutorotateToInterfaceOrientation: в контроллере табличного представления:

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  [self.tableView reloadData];
  return YES;
}

Это должно перезагрузить данные таблицы и (предположительно) перерисовать представления ячейки таблицы. Но это не имеет никакого эффекта.

Есть ли способ заставить ячейку перерисовываться с новой высотой, когда устройство поворачивается?

РЕДАКТИРОВАТЬ : я пробовал следующее, безрезультатно:

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  [self.tableView reloadData];
}

Вот как выглядит приложение в портретной ориентации:

Portait

Вот как выглядит приложение в альбомной ориентации:

Landscape

Между верхним и нижним краями содержимого есть пробел.

РЕДАКТИРОВАТЬ 2 :

Настройка параметра размера с помощью ширины фрейма таблицы помогла решить эту проблему:

CGSize s = [text sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake([tableView frame].size.width,500)];

1 Ответ

6 голосов
/ 16 мая 2009

Это менее чем оптимально, но самое простое решение - вызвать -reloadData на столе.

Лучшим решением было бы позвонить -beginUpdates, -deleteRowsAtIndexPaths:withRowAnimation:, -insertRowsAtIndexPaths:withRowAnimation: и -endUpdates или просто -reloadSections:withRowAnimation:, если настроен только на 3.0. Это добавит анимацию.

Редактировать: И вам также понадобится правильный tableView:heightForRowAtIndexPath:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    CGSize textSize = [[self textForRowAtIndexPath:indexPath] sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake([tableView frame].size.width - 20, 500)];
    return textSize.height + 13.0f;
}

(где textForRowAtIndexPath: - метод, возвращающий текст ячейки)

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