Изменение высоты UITableViewCell при изменении ориентации

У меня есть UITableView с ячейками, содержащими UILabels с переменной высотой. Я могу вычислить минимальную высоту, которую должна использовать метка sizeWithFont:constrainedToSize:lineBreakMode:, которая отлично работает при первом загрузке таблицы. Когда я поворачиваю представление таблицы, ячейки становятся более широкими (это означает, что для отображения содержимого требуется меньше строк). Есть ли способ, которым я могу иметь высоту ячеек, переопределенную UITableView во время анимации изменения ориентации или непосредственно до или после? Спасибо.

Ответ 1

Ваш UITableViewController может реализовать метод tableView:heightForRowAtIndexPath:, чтобы указать высоту строки для определенной строки, и он может посмотреть текущую ориентацию ([[UIDevice currentDevice] orientation]), чтобы решить, какую высоту вернуть.

Чтобы убедиться, что tableView:heightForRowAtIndexPath: снова вызван при изменении ориентации, вам, вероятно, понадобится определить изменение ориентации, как описано в этот вопрос, и вызвать [tableView reloadData].

Ответ 2

Чтобы немного улучшить приведенный выше ответ от @David и ответить на последний комментарий о том, как плавно анимировать его во время вращения, используйте этот метод:

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}

и, конечно, метод делегата высоты:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) {
        return 171.0f;
    } else {
        return 128.0f;
    }
}