UITextView в UITableViewCell плавного автоматического изменения размера - PullRequest
14 голосов
/ 20 сентября 2010

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

Ответы [ 2 ]

16 голосов
/ 05 октября 2010

Попробуйте этот код ниже, это поможет. Вам не нужно использовать какие-либо функции перезагрузки, такие как 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)];
    }
}

// делегат просмотра таблицы

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

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

    return height;
}
11 голосов
/ 14 февраля 2013

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

Прежде всего, конечно, вы захотите создать свой 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;
}

Затем создайте переменную int с именем numberOfLines и установите для нее значение 1 в вашемметод init.Впоследствии в вашем textViewDelegate методе 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...