Как и къде да направите динамично преоразмеряване на височината на UITextView в персонализиран TableCellView, вграден в сценарий?

Полудяваш...прочети десетки отговори „ето как го правиш...“, които се различават един от друг и нито един не работи в моя случай. Забърках се с UITextView рамка, граници, contentSize и т.н. и въпреки че виждам тези промени чрез NSLog, крайният изход винаги се връща обратно към оригиналния размер, зададен в StoryBoard.

С помощта на StoryBoard поставих UITextView само за четене в подклас TableViewCell, наречен GroupChatViewCell.

След това просто зареждам шепа текстови низове в UITextView чрез viewDidLoad на Controller. Низовете са обвити с думи и са по-дълги, отколкото могат да се поберат в дефинираната 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 може да замени кода ви за оразмеряване на изгледи, за да поддържа оригиналните размери, зададени за изгледите във вашия StoryBoard.

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

person Fabrice    schedule 11.03.2014