2014-11-14 5 views
0

Я пытаюсь настроить размер UITableViewCell на его содержание. Это в основном для просмотра чата, где я перечисляю все предыдущие сообщения и позволяю пользователю прокручивать содержимое беседы.Отрегулируйте размер UITableViewCell до его содержимого

Итак, у меня есть UITableView с несколькими прототипами ячеек. Входящие текстовые сообщения, исходящие текстовые сообщения, входящие сообщения изображений, сообщения исходящих изображений и т. Д. Внутри содержимого каждой ячейки есть стандарт UIView, который я намерен использовать для рисования чата. Этот вид занимает почти внутреннее пространство ячейки (8px смещение вверх, слева, внизу и справа, все вокруг). Внутри этого представления я хочу контент. В случае текстовых ячеек (входящих и исходящих) я хочу получить UITextView, который отобразит текстовое сообщение. Это то, что я имею в виду:

enter image description here

В желтый является UIView и внутри него UITextView. Теперь я хочу настроить все на размер текста. Мне удалось выполнить следующее:

  1. sizeToFit выполняет именно то, что мне нужно для UITextView
  2. Я все еще не уверен, как настроить «размер s к UITextView» UIView размер s.
  3. Чтобы настроить высоту ячейки, возможно, я мог бы использовать heightForRowAtIndexPath. Мне не нужно (и я не думаю, что должен) настроить ширину ячейки. Но несколько советов по этому поводу: когда этот метод называется? Будет ли ячейка уже создана? Будут ли уже выложены подпункты? В противном случае, как я могу определить размер контента?

Любой вход на это оценили!

Edit:

мне удалось сделать несколько прогрессирует, следуя учебник, отправленный @vikingosegundo, но я снова застрял. Это то, что у меня есть:

enter image description here

Таким образом, в основном: вид текста имеет ограничения для ведущих, отставая, расстояние до вершины, и расстояние до дна. С другой стороны, сдерживающий взгляд имеет ограничения для трейлинга и расстояния до вершины, так что если размер мал, то он привязывается вправо. Я не могу иметь ведущих ограничений или иначе он всегда будет использовать всю ширину ячейки. Я не уверен относительно расстояния до нижних ограничений.

При вводе небольшого сообщения это выглядит великолепно. Он имеет большой размер, и он стреляет вправо.

enter image description here

Однако длинные сообщения не охватывают несколько строк. Вместо этого он по-прежнему щелкает вправо (ОК), но ширина увеличивается влево, неопределенно.

enter image description here

Клетка уже регулировать его высоту до высоты запрещенного контента:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    HyConversationTableViewCell * cell = (HyConversationTableViewCell *)[self tableView:tableView cellForRowAtIndexPath:indexPath]; 
    CGSize size; 

    [cell setNeedsLayout]; 
    [cell layoutIfNeeded]; 

    size = [cell.textMessageView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 

    return size.height + 32; 
} 

Я предполагаю, что мне сейчас нужно что-то вроде максимальной ширины текстового зрения или что-то, но я понимаете, что это невозможно. Как я могу это решить?

Редактировать: Если у меня было ведущее ограничение для содержащего представления, оно отлично выглядит, когда текст охватывает несколько строк, но не тогда, когда он этого не делает. Вот что он выглядит следующим образом:

enter image description here

И:

enter image description here

Edit: Как полагает Алекс Zavatone, я изменил tableView:heightForRowAtIndexPath: на следующее:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    HyConversationTableViewCell * cell = (HyConversationTableViewCell *)[self tableView:tableView cellForRowAtIndexPath:indexPath]; 

    CGSize overflowSize = CGSizeMake(cell.textMessageView.frame.size.width, FLT_MAX); 
    CGSize sizeAdjusted = [cell.textMessageView sizeThatFits:overflowSize]; 

    return sizeAdjusted.height + 32.0f; 
} 

Это показывает, немного лучше, поскольку высота уже настроена, но поведение несколько неустойчиво. Вот как это выглядит в самом начале:

enter image description here

Так высота правильно, но вид текста не регулирует его ширину. Кроме того, если я прокручиваю ячейки из экрана, а затем обратно (что заставляет их перерисовывать), они начинают вести себя беспорядочно в том, что кажется случайным критерием. Вот пример:

enter image description here

Иногда это происходит с двух последних клеток ...

Edit: Это последняя часть была зафиксирована настройка контента Приоритет обниматься и Content Приоритет сжатия Сопротивление к необходимости и искробезопасности Размер заполнитель. Теперь высота отображается правильно.

+1

http://www.raywenderlich.com/73602/dynamic-table-view-cell-height-auto-layout – vikingosegundo

+0

Удивительный учебник! Также, пожалуйста, см. Мое редактирование. –

ответ

0

Вы можете изменить размер текста, установив высоту на большое количество, а затем используя sizeThatFits.

Не размерToFit.

Как так:

UILabel *label = self.prototypeCell.descriptiveText; 
    label.numberOfLines = 0; 
    CGSize sillyLargeHeight = CGSizeMake(label.frame.size.width, 9999); 
    CGSize labelFrameAdjustedForHeight = [label sizeThatFits:sillyLargeHeight]; 
    return labelFrameAdjustedForHeight.height + 24.0; // 24 is 12 above and 12 below padding. 

Вы можете использовать ярлык или TextView. Если вы решите использовать UILabel, вам нужно установить # строк в 0, чтобы она была несколько строк.

Вы можете сделать это в течение - (CGFloat) Tableview: (UITableView *) Tableview heightForRowAtIndexPath: (NSIndexPath *) indexPath {

Вам также необходимо сделать те же регулировки для установки высоты на поле (используйте IBOutlet) в методе willDisplayCell.

+0

Какие настройки? –

+0

См. Мое редактирование. –

+0

Корректировка (и), упомянутые в моем комментарии. Попробуйте использовать UILabel для проверки, а также проверьте свойства в UITextView, чтобы убедиться, что это слово обертывается в конце строки. –

1

Вот как мы делаем, что

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    AFMediaWithHeadlineCell *cell = [[[NSBundle mainBundle] loadNibNamed:@"AFMediaWithHeadlineCell" 
                        owner:nil 
                       options:nil] firstObject]; 
    [cell loadText:@"Some text"]; 
    return [cell height]; 
} 

фактически loadText: загружает данные в пользовательский интерфейс, и sizeToFit все. и высота основной метод, который вычисляет высоту ячейки

- (void)loadText:(NSString *)aText 
{ 
    self.textView.text = aText; 
    [self.textView sizeToFit]; 
} 

- (CGFloat)height 
{ 
    return self.textView.frame.origin.y + self.textView.frame.size.height + 10; // 10 is margin 
} 
+0

Что такое 'node'? Откуда это? –

+0

см. Мое редактирование, я удалил узел – l0gg3r

4

Если вы используете IOS 8 вы можете использовать UITableViewAutomaticDimension.

Вы можете проверить это example

self.tableView.rowHeight = UITableViewAutomaticDimension; 

Вы можете посмотреть также на этом video: Что нового в таблице и коллекции Представления в 2014 WWDC.

+0

Мне нужна поддержка iOS 7 .. –

Смежные вопросы