Да, я делаю это в приложении, над которым я сейчас работаю.
Вам необходимо отслеживать состояние, в котором находится ячейка, открытая или закрытая. Если одновременно может быть открыта только 1 ячейка, вы можете сделать это, просто сохранив ссылку на текущий indexPath. Если несколько ячеек могут быть открыты одновременно, вам понадобится массив логических значений, который отслеживает, открыта или закрыта каждая из них.
В heightForRowAtIndexPath просто верните правильную высоту в зависимости от того, открыта строка или закрыта.
В cellForRowAtIndexPath, если строка закрыта, скрыть весь контент, который не должен быть виден при закрытии. Представления все еще могут быть там, но они должны быть установлены на hidden = YES
.
Наконец, в didSelectRowAtIndexPath установите заданный индексный путь на открытие, если он был закрыт, и на закрытие, если он был открыт, затем перезагрузите ячейку с [tableView reloadRowsAtIndexPaths:]
. Если вы разрешаете открывать только 1, просто установите текущий путь к открытому индексу на тот, который был выбран, и перезагрузите как тот, который был выбран, так и тот, который был ранее открыт.