Я не собираюсь здесь ничего говорить, чтобы противоречить принятому ответу, считая его совершенно правильным.Однако я собираюсь более подробно рассказать о том, как этого добиться.Если вы не хотите читать все это и больше интересуетесь воспроизведением исходного кода в рабочем проекте, я загрузил пример проекта в GitHub .
БазовыйИдея состоит в том, чтобы иметь внутри метода -tableView: heightForRowAtIndexPath:
условие, определяющее, следует ли расширять текущую ячейку.Это будет вызвано вызовом начала / конца обновлений таблицы из -tableView: didSelectRowAtIndexPath:
. В этом примере я покажу, как создать табличное представление, позволяющее расширять одну ячейку за раз.
Первое, что вам нужно сделать, это объявить ссылку на объект NSIndexPath .Вы можете делать это как хотите, но я рекомендую использовать объявление свойства, например:
@property (strong, nonatomic) NSIndexPath *expandedIndexPath;
ПРИМЕЧАНИЕ: Вам не нужно создавать этот путь индекса внутри viewDidLoad или любого другогоаналогичный метод.Тот факт, что индекс изначально равен нулю, будет означать только то, что в таблице изначально не будет расширенной строки.Если вы предпочитаете, чтобы таблица начиналась с расширенной строки по вашему выбору, вы можете добавить что-то вроде этого в метод viewDidLoad:
NSInteger row = 1;
NSInteger section = 2;
self.expandedIndexPath = [NSIndexPath indexPathForRow:row inSection:section];
Следующий шаг - перейти к вашему UITableViewDelegate. метод -tableView: didSelectRowAtIndexPath:
для добавления логики для изменения расширенного индекса ячейки на основе выбора пользователя.Идея здесь состоит в том, чтобы проверить путь к индексу, который был только что выбран, по пути к индексу, сохраненному в переменной expandedIndexPath
.Если они совпадают, то мы знаем, что пользователь пытается отменить выбор расширенной ячейки, и в этом случае мы устанавливаем переменную равной nil.В противном случае мы устанавливаем переменную expandedIndexPath
для индекса, который был только что выбран.Все это делается между вызовами beginUpdates / endUpdates, чтобы позволить табличному представлению автоматически обрабатывать анимацию перехода.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView beginUpdates]; // tell the table you're about to start making changes
// If the index path of the currently expanded cell is the same as the index that
// has just been tapped set the expanded index to nil so that there aren't any
// expanded cells, otherwise, set the expanded index to the index that has just
// been selected.
if ([indexPath compare:self.expandedIndexPath] == NSOrderedSame) {
self.expandedIndexPath = nil;
} else {
self.expandedIndexPath = indexPath;
}
[tableView endUpdates]; // tell the table you're done making your changes
}
Затем последним шагом является другой UITableViewDelegate метод -tableView: heightForRowAtIndexPath:
.Этот метод будет вызван после того, как вы запустили beginUpdates
один раз для каждого пути индекса, который, по мнению таблицы, нуждается в обновлении.Здесь вы можете сравнить expandedIndexPath
с индексным путем, который в настоящее время переоценивается.
Если два индексных пути совпадают, то это ячейка, которую вы хотите расширить, в противном случае этовысота должна быть нормальной.Я использовал значения 100 и 44, но вы можете использовать то, что соответствует вашим потребностям.
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Compares the index path for the current cell to the index path stored in the expanded
// index path variable. If the two match, return a height of 100 points, otherwise return
// a height of 44 points.
if ([indexPath compare:self.expandedIndexPath] == NSOrderedSame) {
return 100.0; // Expanded height
}
return 44.0; // Normal height
}