UITableViewCell: ячейка сжимается при повторном вызове данных

Я пытаюсь создать приложение для чата. Я заполняю пузыри чата от пера.

Но всякий раз, когда я добавляю новое сообщение в массив и вызываю метод reloadData, ячейки над ним уменьшаются.

Вот мой код для UITableView cellForRowAtIndexPath:

    SentMessageTableViewCell *sentMessageCell;
    sentMessageCell = [tableView dequeueReusableCellWithIdentifier:@"SentChatMessage"];

    if(sentMessageCell == nil)
    {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"SentChatMessage" owner:self options:nil];
        sentMessageCell = [topLevelObjects objectAtIndex:0];
    }
    sentMessageCell.message = message.body;
    [sentMessageCell initWithMessage:message.body andDateTimeStamp:sendDateTimeStamp];
    return sentMessageCell;

Это код для heightForRowAtIndexPath

CGRect expectedLabelSize = [messageBody boundingRectWithSize:CGSizeMake(200, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:[UIFont fontWithName:@"Helvetica" size:13]} context:nil];

if(expectedLabelSize.size.height > 15)
    return expectedLabelSize.size.height + 55;
else
    return 65;

Также вот код для реализации xib SentMessageTableViewCell:

- (void)awakeFromNib {
    // Initialization code
}

- (void) layoutSubviews{
    [super layoutSubviews];

    CGRect expectedLabelSize = [self.message boundingRectWithSize:CGSizeMake(200, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:[UIFont fontWithName:@"Helvetica" size:13]} context:nil];

    if(expectedLabelSize.size.height > 15)
    {
        [LabelMessage setFrame:CGRectMake(50, 30, 200, expectedLabelSize.size.height + 15)];
        [ImageViewChatBox setFrame:CGRectMake(40, 10, 220, expectedLabelSize.size.height + 45)];
    }

    [LabelMessage setText:self.message];
    [LabelDateTimeStamp setText:self.dateTimeStamp];
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];
    // Configure the view for the selected state
}

- (void) initWithMessage:(NSString *)message andDateTimeStamp:(NSString *)dateTimeStamp{
    self.message = message;
    self.dateTimeStamp = dateTimeStamp;
}

Но когда я запускаю приложение, результат примерно такой.

введите описание изображения здесь

Ячейка выше сжимается до размера по умолчанию.

РЕДАКТИРОВАТЬ: Вот мой XIB.

введите описание изображения здесь

Заранее спасибо за помощь.

2 ответа

Решение

Оригинальный комментарий: Не могли бы вы добавить некоторые ограничения для внутренних элементов и попробовать?

Ответ. Отсутствуют ограничения на файл XIB. iOS нуждается в корректных ограничениях для адаптации внутренних элементов после изменения кадра (в данном случае это изменение высоты).

Вы должны изменить свой layoutSubviews метод

- (void) layoutSubviews{
    [super layoutSubviews];

    CGRect expectedLabelSize = [self.message boundingRectWithSize:CGSizeMake(200, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:[UIFont fontWithName:@"Helvetica" size:13]} context:nil];

    if(expectedLabelSize.size.height > 15)
    {
        [LabelMessage setFrame:CGRectMake(50, 30, 200, expectedLabelSize.size.height + 15)];
        [ImageViewChatBox setFrame:CGRectMake(40, 10, 220, expectedLabelSize.size.height + 45)];
    } else {

          // Need to set frame for normal height messages
    }

    [LabelMessage setText:self.message];
    [LabelDateTimeStamp setText:self.dateTimeStamp];
}
Другие вопросы по тегам