获取UITableViewCell类的高度而不进行子类化

时间:2014-04-22 20:56:42

标签: ios objective-c uitableview

我试图计算一个uitableviewcell的高度,而没有使用boundingRectWithSize进行整个舞蹈。

这是我的方法:

+ (CGFloat)heightForItem:(id<DDInfoItem>)item
{
    if (!PrototypeCell)
        PrototypeCell = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:nil options:nil][0];

    [PrototypeCell configureForItem:item];
    [PrototypeCell layoutIfNeeded];

    CGSize size = [PrototypeCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
    return size.height+1;
}

不幸的是,这一行

CGSize size = [PrototypeCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

返回nil ...我怀疑因为我没有设置自己的约束,因为它不是UITableViewCell的子类。谁能确认一下?在这种情况下,是否有一种简单的方法要求细胞自我调整大小?

谢谢!

更新

即使我已经进行了子类化并且在IB中添加了约束,我仍然会在高度上获得0。

以下是我在调试器中对contentView的限制:

<NSLayoutConstraint:0x170091030 H:|-(NSSpace(20))-[UILabel:0x12766b610]   (Names: '|':UITableViewCellContentView:0x178361380 )>,
<NSLayoutConstraint:0x170094370 V:|-(NSSpace(20))-[UILabel:0x12766b610]   (Names: '|':UITableViewCellContentView:0x178361380 )>,
<NSLayoutConstraint:0x1700992d0 H:[UILabel:0x12766b610]-(NSSpace(20))-|   (Names: '|':UITableViewCellContentView:0x178361380 )>,
<NSLayoutConstraint:0x170099500 V:[UILabel:0x12766b610]-(NSSpace(8))-[UILabel:0x127559c20]>,
<NSLayoutConstraint:0x170099000 H:[UILabel:0x127559c20]-(NSSpace(20))-|   (Names: '|':UITableViewCellContentView:0x178361380 )>,
<NSLayoutConstraint:0x17009c430 H:|-(NSSpace(20))-[UILabel:0x127559c20]   (Names: '|':UITableViewCellContentView:0x178361380 )>

请注意,我已使用nib加载方法替换了Prototype单元的initWithStyle:identifier:

此外,当我记录标签的大小时,它们确实似乎正在调整大小。调用systemLayoutSizeFittingSize:的结果仍然是0高度:/

2 个答案:

答案 0 :(得分:0)

你可能在这个过程中过早地要求高度。高度为0,因为此时尚未确定高度。

答案 1 :(得分:0)

为了它的价值,我最终只是这样做了:

if (!PrototypeCell)
    PrototypeCell = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:nil options:nil][0];

[PrototypeCell configureForItem:item];
[PrototypeCell setNeedsLayout];
[PrototypeCell layoutIfNeeded];

return CGRectGetMaxY(PrototypeCell.subLabel.frame) + bottomBufferSpacing;