Источник данных (который обычно является UITableViewController) может быть тем, который вычисляет максимальную ширину любой строки, которую он предоставляет UITableView. В этот момент источник данных может изменить фрейм UITableView, и это должно активировать механизм перезагрузки UITableView. Благодаря NSString UIKit Additions вычисление максимальной ширины строки легко. Также позаботьтесь о том, чтобы установить ограничение ширины таблицы, указав максимальную ширину (вы упомянули 400).
CGFloat maxWidth = 0.0;
CGSize maxSize = CGSizeMake(400,99999);
CGFloat cellIndent = 0; //Use this to account for any cell indenting
for(NSString * text in datasource.array){
CGSize textSize = [text sizeWithFont:yourFont
constrainedToSize:maxSize
lineBreakMode:UILineBreakModeWordWrap];
maxWidth = MAX(maxWidth,textSize.width + 2.0*cellIndent);
}
//Now change the tableView's frame
CGRect newFrame = tableView.frame;
newFrame.size.width = maxWidth;
tableView.frame = newFrame;
//I don't believe a table reload is necessary let me know
[tableView reloadData];
Вам также следует подумать о том, как будет располагаться табличное представление после изменения ширины. Так как источник кадра никогда не изменялся, верхний левый угол представления таблицы останется в той же позиции, но будет расти вправо.