Резко изменять размер текстового представления и таблицы представления таблицы в представлении статической таблицы

У меня есть статическое представление таблицы, которое я использую как сот ввода данных для моего приложения. Одна из этих ячеек имеет UITextView в ней, которая должна расти и динамически сжиматься по мере того, как пользователь вводит, а также с ростом/сокращением ячейки с ней. Я прочитал кучу сообщений об этом, но я думаю, что меня бросают, потому что я использую табличное представление STATIC.

Вот моя попытка изменения размера (в целом это полный сбой):

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

    float height = 44.0;
    height += (textView.font.lineHeight * (self.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];

    [self.messageTextView setContentInset:UIEdgeInsetsZero];
}

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

Я возьму все советы! Спасибо.

Ответы

Ответ 1

Вам не нужно ничего делать, просто просматривайте этот код: Существует новая функция для замены sizeWithFont, которая ограничиваетRectWithSize.

Добавьте в мой проект следующую функцию, которая использует новую функцию на iOS7 и старую на iOS ниже 7. Она имеет в основном тот же синтаксис, что и sizeWithFont:

   -(CGSize)text:(NSString*)text sizeWithFont:(UIFont*)font constrainedToSize:(CGSize)size{
        if(IOS_NEWER_OR_EQUAL_TO_7){
            NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                              font, NSFontAttributeName,
                                              nil];

            CGRect frame = [text boundingRectWithSize:size
                                              options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
                                           attributes:attributesDictionary
                                              context:nil];

            return frame.size;
        }else{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
            return [text sizeWithFont:font constrainedToSize:size];
#pragma clang diagnostic pop
        }
    }

Вы можете добавить, что IOS_NEWER_OR_EQUAL_TO_7 в файле prefix.pch в вашем проекте:

#define IOS_NEWER_OR_EQUAL_TO_7 ( [ [ [ UIDevice currentDevice ] systemVersion ] floatValue ] >= 7.0 )

Я ссылаюсь на эту ссылку: -

UITableViewCell с высотой UITextView в iOS 7?

Ответ 2

Пожалуйста, проверьте мой ответ.

Вычислить высоту UITableViewCell для соответствия строке

Здесь метка используется для вычисления высоты ячейки.

Когда вы закончили редактирование текста в текстовом поле - (void)textViewDidEndEditing:(UITextView *)textView, вызовите функцию tableview reloadData для обновления ячейки в соответствии с текстом, введенным в textview

Ответ 3

Вам нужно вручную вычислить новый размер textView и вручную вызвать обновление для tableView.

static CGFloat cellHeight = 85;//from story board height to
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
    if (indexPath.row == 0) {
        return cellHeight + [self appendTextViewNewHeight];
    }
    return cell.bounds.size.height;
}

-(CGFloat) appendTextViewNewHeight {
    return _appendHeightForTextView;
}

static CGFloat textViewHeightStartHeight = 33;//from storiboard height
- (void)textViewDidChange:(UITextView *)textView;
{
    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    if (newFrame.size.height >= textViewHeightStartHeight) {
        CGFloat newAppend = newFrame.size.height - textViewHeightStartHeight;
        if (newAppend != self.appendHeightForTextView) {
            self.appendHeightForTextView = newAppend;
            [self.tableView beginUpdates];
            [self.tableView endUpdates];
        }
    }
}

Также вам нужно установить делегатов на раскадровки в коде. В viedDidLoad вам нужно сделать следующее:

self.appendHeightForTextView = 0;   

И, наконец, установите ограничения в раскадровке для вашей ячейки. Не устанавливайте нижнее ограничение вашего текста. Установите только правую, левую и верхнюю части.