У меня была та же проблема с приложением для iPad, и я нашел другое решение, не рассчитав высоту самого текста.
Сначала создайте пользовательский UITableViewCell в IB с UITextField, помещенным в contentView ячейки. Важно установить для текстового представления scrollEnabled значение NO, а для autoresizingMask - FlexibleWidth и FlexibleHeight.
В ViewController реализуйте метод делегата текстового представления -textViewDidChanged: следующим образом, где textHeight является переменной экземпляра с типом CGFloat, а -tableViewNeedsToUpdateHeight является Пользовательский метод мы определим на следующем шаге.
- (void)textViewDidChange:(UITextView *)textView
{
CGFloat newTextHeight = [textView contentSize].height;
if (newTextHeight != textHeight)
{
textHeight = newTextHeight;
[self tableViewNeedsToUpdateHeight];
}
}
Метод -tableViewNeedsToUpdateHeight вызывает beginUpdates и endUpdates представления таблицы, поэтому само представление таблицы будет вызывать -tableView: heightForRowAtIndexPath: метод делегата.
- (void)tableViewNeedsToUpdateHeight
{
BOOL animationsEnabled = [UIView areAnimationsEnabled];
[UIView setAnimationsEnabled:NO];
[table beginUpdates];
[table endUpdates];
[UIView setAnimationsEnabled:animationsEnabled];
}
В табличном представлении -tableView: heightForRowAtIndexPath: метод делегата нам нужно вычислить новую высоту для ячейки текстового представления на основе textHeight .
Сначала нам нужно изменить размер ячеек текстового представления до максимально доступной высоты (после вычитания высоты всех других ячеек в табличном представлении). Затем мы проверяем, больше ли textHeight, чем вычисленная высота.
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CGFloat heightForRow = 44.0;
if ([indexPath row] == kRowWithTextViewEmbedded)
{
CGFloat tableViewHeight = [tableView bounds].size.height;
heightForRow = tableViewHeight - ((kYourTableViewsNumberOfRows - 1) * heightForRow);
if (heightForRow < textHeight)
{
heightForRow = textHeight;
}
}
return heightForRow;
}
Для лучшего взаимодействия с пользователем установите вкладки содержимого табличного представления для нижней части, например. 50,0.
Я протестировал его на iPad с iOS 4.2.1 и работает как положено.
Florian