Вы просто должны использовать табличное представление для контроля высоты. Вы можете сказать таблице, в которой ячейка была изменена, используя вызовы для удаления, а затем повторно добавить определенные ячейки, так что вам не нужно перезагружать всю таблицу - но высота должна быть получена с помощью функции обратного вызова делегата tableView: heightForRow: atIndexPath:
Я не понимаю, почему это не практично. У вас может быть любое количество запущенных асинхронных систем, которые обновляют центральный кеш высоты, сохраняемый делегатом табличного представления - каждый раз, когда вы создаете ячейку, вы можете назначить ее делегатом в качестве ссылки, чтобы у нее был способ вернуться к таблице и позволить он знает, что клетки нуждаются в перезагрузке и каковы новые высоты.
Если подумать, плохое табличное представление - это прокручиваемое представление, которое должно управлять всеми этими отдельными ячейками и визуально хранить их вместе - так что действительно непросто, чтобы ячейка пошла в жульничество и начала изменять кадры, не позволяя табличному представлению знаю, что происходит в любом случае. Лучше всего дать столу сесть за руль и сказать ему, что делать.