Вы правильно вычисляете высоту ячейки в своем методе heightForRowAtIndexPAth, но затем в своем методе cellForRowAtIndexPath вы фактически никогда не используете его для установки высоты вашей метки внутри него.
Таким образом, таблица выделяет правильное количество пространства на основе вашего heightForRowAtIndexPath, но затем вставляет в это пространство ячейку без размеров, возвращаемую из cellForRowAtIndexPath. Я думаю, что это может быть причиной проблемы и объяснить результаты, которые вы видите.
В cellForRowAtIndexPath вам необходимо установить высоту надписи, используя те же вычисления.
т.е.
CGSize constrainedSize = CGSizeMake(cell.detailTextLabel.frame.size.width, CGFLOAT_MAX);
CGRect cframe = cell.detailTextLabel.frame;
cframe.size.height = constrainedSize.height;
cell.detailTextLabel.frame = cframe;
Вам также может понадобиться установить рамку просмотра контента (не знаю, как она работает с нестандартной ячейкой).
Я также не уверен, что было бы неплохо вызывать cellForRowAtIndexPath из метода heightForRowAtIndexPath (вероятно, было бы лучше просто получить прямой доступ к текстовым данным, которые вы используете непосредственно для вычисления размера).