【问题标题】:UITableViewCell : cell shrinks on reload data callUITableViewCell :重新加载数据调用时单元格缩小
【发布时间】:2015-07-28 11:34:41
【问题描述】:

我正在尝试制作一个聊天应用程序。我从 nib 填充聊天气泡。

但是每当我向数组添加新消息并调用 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;

这里也是 SentMessageTableViewCell xib 实现的代码:

- (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。

提前感谢您的帮助。

【问题讨论】:

  • 请同时发布 heightForRowAtIndexPath: 方法的代码。
  • NSLog 方法中的数字,它实际返回的内容。我不会依赖expectedLabelSize,在 reloadTableView() 之后可能会缩小
  • @ZeMoon 我使用了 heightForRowAtIndexPath 方法来设置高度。如您所见,高度保持不变,只是单元格内的内容缩小了。
  • 能不能给内部元素加一些约束试试看?
  • @ErsinSezgin 非常感谢您的建议。这解决了我的问题。请提供该答案,以便我将其标记为已解决。

标签: ios objective-c uitableview layoutsubviews


【解决方案1】:

你需要改变你的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];
}

【讨论】:

  • @Ashish P:我已经添加了我的 xib 文件。 Interface Builder中不是已经设置了默认大小了吗?
【解决方案2】:

原评论:能不能给里面的元素加一些约束试试?

答案: xib 文件缺少约束。 iOS 需要正确的约束来适应框架(在这种情况下是高度变化)变化后的内部元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多