I have a UITableView with cells containing variable-height UILabels. I am able to calculate the minimum height the label needs to be using sizeWithFont:constrainedToSize:l
Your UITableViewController can implement the tableView:heightForRowAtIndexPath: method to specify the row height for a particular row, and it can look at the current orientation ([[UIDevice currentDevice] orientation]) to decide what height to return.
To make sure tableView:heightForRowAtIndexPath: gets called again when the orientation changes, you'll probably need to
detect the orientation change as described in this question, and call [tableView reloadData].