Как и где сделать динамическое изменение размера UITextView внутри пользовательского TableCellView, встроенного в раскадровку?

Схожу с ума... прочитал десятки ответов "вот как ты это делаешь...", которые все отличаются друг от друга, и ни один из них не работает в моем случае. Я запутался с рамкой UITextView, границами, contentSize и т. д., и хотя я вижу эти изменения через NSLog, конечный результат всегда возвращается к исходному размеру, установленному в StoryBoard.

Используя StoryBoard, я поместил UITextView только для чтения в подкласс TableViewCell с именем GroupChatViewCell.

Затем я просто загружаю несколько текстовых строк в UITextView через viewDidLoad контроллера. Строки переносятся по словам и длиннее, чем могут поместиться в определенном кадре UITextView.

Я изменяю размер ячейки TableView (которая работает) в делегате TableView:heightForRowAtIndexPath и пытаюсь изменить размер UITextView (не работает) в делегате TableView:cellForRowAtIndexPath.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"GroupChatViewCell";

GroupChatViewCell *cell = (GroupChatViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if (cell == nil) {
    cell = [[GroupChatViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}

// Retrieve the MessageData for the given row
GroupMessageData *aMessageData = [messageThreadArray objectAtIndex:indexPath.row];

[cell.messageLabel setText:aMessageData.msgText];
[cell.messageLabel sizeToFit];

//    [cell.messageLabel layoutIfNeeded];  --> Did try with this, does not work
//    [cell.messageLabel layoutSubviews];  --> Did try with this, does not work

return cell;
}




- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
GroupMessageData *aMessageData = [messageThreadArray objectAtIndex:indexPath.row];

GroupChatViewCell *cell = (GroupChatViewCell *)[tableView dequeueReusableCellWithIdentifier:@"GrooupChatViewCell"];


UIFont *cellFont = [UIFont systemFontOfSize:12];
CGSize constraintSize = CGSizeMake(CGRectGetWidth(cell.bounds), MAXFLOAT);
CGSize labelSize = [aMessageData.msgText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:NSLineBreakByWordWrapping];
return ceil(labelSize.height + 60);
}

Я получаю увеличенный размер для TableCell, но не для UITextView, который не изменился и обрезался до исходного размера, установленного в StoryBoard, и отображал только 3 подходящие строки текста.

Что мне нужно сделать и где, чтобы увеличить высоту UITextView до полного размера, выделенного в ячейке, и правильно отобразить все строки текста???


person Fabrice    schedule 10.03.2014    source источник


Ответы (2)


Вам нужно будет изменить рамку UITextView внутри контроллера ячейки таблицы. Например:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
GroupMessageData *aMessageData = [messageThreadArray objectAtIndex:indexPath.row];

GroupChatViewCell *cell = (GroupChatViewCell *)[tableView dequeueReusableCellWithIdentifier:@"GrooupChatViewCell"];

UIFont *cellFont = [UIFont systemFontOfSize:12];
CGSize constraintSize = CGSizeMake(CGRectGetWidth(cell.bounds), MAXFLOAT);
CGSize labelSize = [aMessageData.msgText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:NSLineBreakByWordWrapping];

[cell adjustTextViewHeight];

return ceil(labelSize.height + 60);
}

И в вашем GroupChatViewCell.m:

- (void) adjustTextViewHeight{
CGRect frame = self.textView.frame;
self.textView.frame = CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, self.textView.contentSize.height);
}

Это также должно изменить высоту textView. Кроме того, если у вас есть максимальная высота ячейки, вы можете использовать функцию MIN, чтобы выбрать правильную высоту. Например:

Вместо : self.textView.contentSize.height можно: MIN (maxHeight, self.textView.contentSize.height)

person Tcharni    schedule 10.03.2014

Что ж... наконец-то я узнал, что происходит... и я не видел упоминания об этом ни в одной ветке, которую я просматривал...

Оказывается, режим AutoLayout был включен по умолчанию, как указано в окне File Inspector. Тем не менее, я не использовал активно AutoLayout и, конечно же, никогда не заглядывал в File Inspector.

Из того, что я могу понять, вот как ведет себя AutoLayout: - если вы отключите его, то вы полностью контролируете все размеры и размещение. - если вы оставите его включенным (по умолчанию) и будете активно управлять ограничениями ваших представлений, тогда AutoLayout будет регулировать размер и положение. - если вы оставите его включенным и НЕ будете активно управлять ограничениями, то похоже, что AutoLayout может переопределить ваш код для изменения размеров представлений, чтобы сохранить исходные размеры, которые были установлены для представлений в вашей раскадровке.

Таким образом, простое отключение AutoLayout решило проблему. И включение AutoLayout и установка верхних и нижних ограничений для UITextView и его ячейки-контейнера также решили проблему.

person Fabrice    schedule 11.03.2014