Вы не должны устанавливать высоту в методе cellForRowAtIndexPath. есть еще один метод UITableViewDatasource с именем tableView: heightForRowAtIndexPath: который вы должны реализовать, чтобы получить высоту ячейки. Будьте осторожны, используя это, хотя; вы не должны получить ячейку по этому пути индекса в этом методе; если вы это сделаете, вы построите бесконечный рекурсивный цикл.
Редактировать: будет ясно; вам нужно вычислить высоту ячейки, основываясь исключительно на ее содержимом, а не на самой ячейке.
Кроме того, в вашем коде, где вы создаете ячейку, вы можете просто передать CGRectZero аргументу frame; если вы это сделаете, табличное представление вычислит сам фрейм ячейки (а также, если я правильно помню, передача в фрейме устарела в OS 3.0).