是否可以继承UITableView,并根据单元格数使其高度具有内在的内容大小?

时间:2014-11-25 19:10:04

标签: ios objective-c cocoa-touch uitableview uiview

我希望我的UITableView只有它所需要的高度,因为它漂浮在主UIViewController view之上。如果我硬编码200的高度和theres'表中只有一个单元格,看起来很傻。

我知道在我的视图控制器中,我可以监视表视图并根据它具有的单元格数定义它的高度,但是高度是视图的属性,对于MVC,它不会&# 39; t对于控制器积极管理视图的高度非常有意义。

是否可以拥有一个UITableView子类,并根据它所拥有的单元格数定义一个内在高度?因此,使用自动布局,我可以将子类添加到我的视图中,指定其宽度,将其垂直居中,并可能定义一个小于或等于"高度约束说要保持小于200pts。但是大多数情况下视图的内在内容大小会自动定义视图的高度吗?

这就像UILabel能够水平和垂直居中,距离左右一定距离,让它自动垂直增长和缩小。

我可以用UITableView子类来实现吗?

3 个答案:

答案 0 :(得分:3)

您可以通过让表视图使用其contentSize属性“知道”它需要多高来轻松完成此操作。如果您使用估计的行高,此值可能会有些不准确,但它应该足够好。在这个例子中,我给表视图一个高度约束(以及width和centerY),并为它做了一个IBOutlet(heightCon)。唯一需要的代码就是这个,

@interface RDTableView ()
@property (weak,nonatomic) IBOutlet NSLayoutConstraint *heightCon;
@end

@implementation RDTableView

-(void)reloadData {
    [super reloadData];
    self.heightCon.constant = MIN(200, self.contentSize.height);
}

您还必须覆盖reloadRowsAtIndexPaths:withRowAnimation:和 reloadSections:withRowAnimation:如果你用其中任何一个更新你的表。

答案 1 :(得分:0)

当您(重新)加载TableView中的数据时,您可以执行此操作。 TableView只需要它所需的高度

CGRect frame = youTableView;
frame.size.height = CELL_HEIGHT*[yourArray count];
if(frame.size.height > MAX_TABLEVIEW_HEIGHT)
{
    frame.size.height = MAX_TABLEVIEW_HEIGHT
}
youTableView.frame = frame;

答案 2 :(得分:0)

这就像设计用户界面时的鸡/蛋问题一样。听起来你想根据它包含的行数*每行的高度来设置浮动tableview的高度,但是tableview在绘制它之前不知道任何这些信息,即[tableView reloadData]和相应的调用行委托方法的高度。

我建议将tableview渲染到某处,绘制所有行,总结每行的所有高度,然后使用适当的CGRect将视图呈现给用户。