2010-09-20 2 views
13

У меня есть UITextView в представлении контента UITableViewCell и разрешает ячейке выполнять автоматическую сортировку, чтобы текст полностью отображался - то, что я пытаюсь выполнить, является ячейкой для автосохранения, например, с помощью приложения iOS4 Contacts имеет, когда вы вводите «заметки» для контакта, то есть когда изменяется contentSize textView - я вызываю reloadRowsAtIndexPaths, а в высоте делегатаForRowAtIndexPath я предоставляю новую высоту для строки - это делает работу, однако это не так приятно и плавно, как contact-app - я почти уверен, что Apple использует какой-то недокументированный трюк в этом приложении, чтобы содержимое контента ContentView расширялось гладко и анимировано без вызова reloadRowsAtIndexPaths. Мой вопрос: как вы предлагаете реализовать такую ​​функциональность? Надеюсь, я не пропустил никаких подробностей в объяснении.UITextView в UITableViewCell плавное автоматическое изменение размера

+0

вы пробовали с помощью анимации UIView в? Я никогда не использовал их для этого, но это может сработать. – Jukurrpa

+0

Да, я пробовал анимацию UIView для внутреннего содержимого, это немного сглаживает процесс, но мне интересно, есть ли способ не использовать reloadRowsAtIndexPaths, кажется, что для этого нет открытого метода. – justadreamer

ответ

15

Попробуйте этот код ниже, это поможет. Вам не нужно использовать какие-либо функции перезагрузки, такие как reloadRowsAtIndexPaths.

// TextView делегат

- (void)textViewDidChange:(UITextView *)textView { 
    if (contentView.contentSize.height > contentRowHeight) { 

    contentRowHeight = contentView.contentSize.height; 

    [theTableView beginUpdates]; 
    [theTableView endUpdates]; 

    [contentView setFrame:CGRectMake(0, 0, 300.0, contentView.contentSize.height)]; 
    } 
} 

// TableView делегат

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

    if (indexPath.row == 0) 
     height = kTitleRowHeight; 
    else 
     height = contentRowHeight; 

    return height; 
} 
+0

Что такое contentView в этом коде? Я предполагаю, что это textView? – justadreamer

+0

Это свойство UITableViewCell. В это свойство добавляется UITextView. [cell.contentView addSubview: textView]; –

+0

Я использую это решение в своем приложении, и он работает на iPhone на 100%, но на iPad это не так: когда пользователь вводит более одной строки текста, 'UITableViewCell' становится выше, как предполагается , но 'UITextView' фактически перемещается * вверх *, так что первая строка текста находится над вершиной' UITableViewCell' - и скрыта. Любые идеи о том, как решить эту проблему на iPad? – Jason

11

Я нашел лучший способ решить эту проблему.

Во-первых, вы, конечно же, захотите создать свой UITextView и добавить его в контентную ячейку contentView. Я создал переменная экземпляра UITextView называется «cellTextView» Вот код, который я использовал:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; 

    if (!cellTextView) { 
     cellTextView = [[UITextView alloc] initWithFrame:CGRectMake(5.0, 5.0, cell.bounds.size.width - 30.0, cell.bounds.size.height - 10.0)]; // I use these x and y values plus the height value for padding purposes. 
    } 
    [cellTextView setBackgroundColor:[UIColor clearColor]]; 
    [cellTextView setScrollEnabled:FALSE]; 
    [cellTextView setFont:[UIFont boldSystemFontOfSize:13.0]]; 
    [cellTextView setDelegate:self]; 
    [cellTextView setTextColor:[UIColor blackColor]]; 
    [cellTextView setContentInset:UIEdgeInsetsZero]; 
    [cell.contentView addSubview:cellTextView]; 

    return cell; 
} 

Затем создайте ИНТ переменную numberOfLines и установить переменную 1 в методе инициализации. После этого, в вашем методе textViewDelegate «s textViewDidChange, используйте этот код:

- (void)textViewDidChange:(UITextView *)textView 
{ 
    numberOfLines = (textView.contentSize.height/textView.font.lineHeight) - 1; 

    float height = 44.0; 
    height += (textView.font.lineHeight * (numberOfLines - 1)); 

    CGRect textViewFrame = [textView frame]; 
    textViewFrame.size.height = height - 10.0; //The 10 value is to retrieve the same height padding I inputed earlier when I initialized the UITextView 
    [textView setFrame:textViewFrame]; 

    [self.tableView beginUpdates]; 
    [self.tableView endUpdates]; 

    [cellTextView setContentInset:UIEdgeInsetsZero]; 
}  

Наконец, вставьте этот код в ваш метод heightForRowAtIndexPath:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    float height = 44.0; 
    if (cellTextView) { 
     height += (cellTextView.font.lineHeight * (numberOfLines - 1)); 
    } 
    return height; 
} 
+0

+1 Это хорошо работает. –

+1

yep, это отлично работает +1. Кроме того, сохраняя numberOfLines в NSArray при индексе = indexPath.row с помощью textView.tag, установленного в indexPath.row, он делает несколько UITextview во многих ячейках меняющимися с размером текста в каждой ячейке. – Rambatino

+0

Спасибо! И легким решением для этого было бы найти другой способ определения того, какой textView вы хотите изменить. Этот код был разработан для работы с одним текстовым элементом на ячейку. –

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