Как создать ячейку таблицы с автоматическим изменением размера для ввода текста, как в приложении «почта» на iPhone? - PullRequest
6 голосов
/ 23 августа 2010

Я пытаюсь эмулировать что-то похожее на страницу «новое сообщение» в почтовом приложении Apple на iphone. Я реализовал это с помощью таблицы, и я успешно получил строки «To», «CC» и «Subject» для правильного поведения, но я не уверен, как реализовать фактическую часть сообщения на странице.

У меня есть несколько проблем. В настоящее время я пытаюсь реализовать это, помещая UITextView в ячейку (я отключаю полосы прокрутки в текстовом представлении). У меня есть текстовое представление, изменяющее размеры себя, когда это изменяется, изменяя его структуру к новой высоте содержания. Первая проблема заключается в том, что мне также нужно сделать это для самой высоты клетки. Поскольку heightForRowAtIndexPath, кажется, вызывается только при первой загрузке строки, я не могу изменить высоту там. Я полагаю, я мог бы вызвать перезагрузку данных в таблице, но кажется, что было бы действительно неэффективно делать всю таблицу каждый раз, когда вводится текст. Каков наилучший способ автоматического изменения размера ячейки таблицы при вводе пользователем? Я нашел много примеров того, как сделать это для одиночных табличных представлений и как изменить размеры ячеек таблицы при инициализации, но я не могу найти ни одного, который позволял бы вам делать оба одновременно.

Наконец, я бы хотел, чтобы нижняя граница ячейки таблицы была невидимой. Если вы посмотрите на почтовое приложение, то заметите, что в нижней части пространства сообщений нет строки, что означает, что вы можете просто продолжать печатать. У меня всегда есть один в моем табличном представлении (даже когда я добавляю нижний колонтитул), и я не могу понять, как избавиться от этого. (Может быть, я должен сделать свое тело сообщения нижним колонтитулом?)

Ответы [ 3 ]

3 голосов
/ 23 августа 2010

Я бы рекомендовал использовать UIScrollView самостоятельно вместо UITableView.UITableView на самом деле не создан для поддержки такой вещи.

2 голосов
/ 23 августа 2010

Mail.app не использует UITableView. Похоже, там пользовательские элементы (метки и текстовые поля) с UITextView внизу.

1 голос
/ 04 апреля 2013

Вы можете попробовать мой ответ на вопрос, похожий на этот ... ключ должен использовать

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

Чтобы сделать это без перезагрузки данных.

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

- (UITableViewCell *)tableView:(UITableView *)tableView fileNameCellForRowAtIndexPath:(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.Впоследствии в методе textViewDidChange вашего textViewDelegate используйте этот код:

- (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, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...