iOS 7在第一次传递时错误计算UITableViewCell高度

时间:2014-10-28 17:20:05

标签: ios uitableview autolayout

我正在尝试计算iOS 7中我的uitableviewcell子类的高度,我发现在第一次通过时,计算是不正确的。但是,如果我稍后重新加载tableview,第二遍的计算确实是正确的。以下是我计算单元格高度的方法:

    if (_prototypeHeader == nil) {
            _prototypeHeader = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([DDStatusTableViewCell class]) owner:nil options:0] lastObject];
    }
    [_prototypeHeader setFrame:CGRectMake(0, 0, CGRectGetWidth(tableView.frame), 0)];
    [_prototypeHeader configureForMenu:self.menu atRestaurant:self.restaurant];
    [_prototypeHeader setNeedsLayout];
    [_prototypeHeader layoutIfNeeded];

    CGSize size = [_prototypeHeader.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
    NSLog(NSStringFromCGSize(size));
    return size.height + 1;

日志语句记录的大小为:

2014-10-28 10:15:45.492 MyApp[39252:613] {350, 77} <--- this is incorrect
2014-10-28 10:15:46.495 MyApp[39252:613] {294, 110} <--- this is correct

我在两种情况下都记录了tableview宽度,看起来是一致的320.这只是iOS 7中的一个问题。是什么给出了?

谢谢!

修改

经过进一步检查后,我确定顶部标签的布局宽度不正确。在标签的layoutSubviews方法中,我这样做:

- (void)layoutSubviews {
    [super layoutSubviews];
    self.titleLabel.preferredMaxLayoutWidth = self.titleLabel.frame.size.width;
    self.detailLabel.preferredMaxLayoutWidth = self.detailLabel.frame.size.width;
    [super layoutSubviews];
}

在第一遍中,titleLabel的宽度为170,而在第二遍中,宽度为130.仍然试图找出原因。第一遍中,contentView的宽度也是360,第二遍则缩小到320。似乎调整标签宽度的布局代码发生在contentView调整其大小之前。

1 个答案:

答案 0 :(得分:3)

要求单元格在更改preferredMaxLayoutWidth之前布局contentView似乎可以解决问题。

- (void)layoutSubviews {
    [super layoutSubviews];
    [self.contentView layoutIfNeeded];
    self.titleLabel.preferredMaxLayoutWidth = self.titleLabel.frame.size.width;
    self.detailLabel.preferredMaxLayoutWidth = self.detailLabel.frame.size.width;
    [super layoutSubviews];
}