我正在尝试计算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调整其大小之前。
答案 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];
}