вычисление количества строк, когда мы даем текст в UITableviewcell? - PullRequest
2 голосов
/ 30 ноября 2009

Я хочу рассчитать количество строк, когда мы даем текст в UITableviewcell? Я вставил текст через UITextview, который находится в ячейке UITableview. Но я хочу увеличить высоту ячейки основан на UItextview, который находится в UITableview cell.suppose, если он имеет 4 строки, одну высоту ... в противном случае другую высоту ... я хочу также рассчитать, сколько строк в UITextview ... и также установить высоту во время выполнения - любая помощь пожалуйста ..

Ответы [ 2 ]

5 голосов
/ 30 ноября 2009

Чтобы рассчитать приблизительный размер вашего UITextView на основе строки, попробуйте метод NSString s - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode.

Например:

NSString *myText = @"Lorem ipsum dolor sit amet, consectetur adipisicing...";

CGSize newSize = [myText sizeWithFont:[textView font]
                    constrainedToSize:CGSizeMake([textView frame].size.width, MAXFLOAT)
                        lineBreakMode:UILineBreakModeWordWrap];

CGFloat newTextViewHeight = newSize.height;
CGFloat newTableViewCellHeight = newTextViewHeight + 42;

... где textView относится к вашему UITextView. (Я также предположил, что режим перевода строки UITextView равен UILineBreakModeWordWrap; если это не так, убедитесь, что вы изменили соответствующий код.)

2 голосов
/ 30 ноября 2009

Вы можете рассчитать подобранный размер UILabel на основе содержимого NSString, используя категорию UIKitAdditions на NSString. Эти методы включают ...

-sizeWithFont:
-sizeWithFont:constrainedToSize:
-sizeWithFont:constrainedToSize:lineBreakMode:
-sizeWithFont:forWidth:lineBreakMode:
-sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:

В моих реализациях этого шаблона я обычно использую третий, -sizeWithFont:constrainedToSize:lineBreakMode:.

Наиболее эффективные реализации переменной высоты UITableViewCells вычисляют размер только один раз для отображаемой строки. Обычно это дорогостоящая операция, и вы определенно не хотите, чтобы дорогие операции выполнялись часто во время прокрутки - ваш FPS прокрутки упадет через пол. Это означает, что где-то кешируется вычисленная высота, а для меня это где-то объект модели, связанный с конкретной строкой.

Лично я создаю собственный подкласс UITableViewCell всякий раз, когда я реализую ячейку таблицы переменной высоты. Затем я создаю метод класса, который просто выполняет операцию sizeWithFont:constrainedToSize:lineBreakMode: для объекта модели, который будет содержать строку, отображаемую в качестве параметра. Тогда реализация контроллера табличного представления tableView:heightForRowAtIndexPath: выглядит примерно так:

- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath {
  CGFloat height;
  DataObject *rowData = [self.dataArray objectAtIndex:indexPath.row];

  if (rowData.cachedHeight) {
    height = [rowData.cachedHeight doubleValue];
  } else {
    height = [CustomTableViewCell heightForRowWithString:rowData.contentStr];
    rowData.cachedHeight = [NSNumber numberWithDouble:height];
  }

  return height;
}

N.B. Вы могли бы / должны, вероятно, использовать UILabel, а не UITextView, поскольку вам не нужно поведение прокрутки UITextView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...