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];
}