是否可以对 UITableView 进行子类化,并根据单元格的数量使其具有其高度的固有内容大小



我希望我的UITableView只像它需要的高度一样高,因为它漂浮在主UIViewController view上方。如果我硬编码高度为 200,而表中只有一个单元格,它看起来很愚蠢。

我知道在我的视图控制器中,我可以监视表视图并根据其具有的单元格数定义其高度,但高度是视图的属性,对于 MVC,控制器主动管理视图的高度没有多大意义。

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

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

我可以用UITableView子类来做到这一点吗?

您可以通过让表视图使用其 contentSize 属性来"知道"它需要多高来轻松做到这一点。如果使用估计的行高,此值可能有些不准确,但它应该足够好。在此示例中,我为表视图提供了高度约束(以及宽度和中心Y),并为其制作了一个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: 和reloadSection:withRowAnimation:如果您也使用其中任何一个更新表。

这感觉就像你在设计UI时遇到的鸡/蛋问题。听起来你想根据浮动表视图包含多少行*每行高度来设置它的高度,但是表视图在绘制之前不知道任何这些信息,即[tableView reloadData]和相应的行委托方法的高度被调用。

我建议在屏幕外的某个地方渲染表格视图,绘制所有行,汇总每行的所有高度,然后使用适当的 CGRect 向用户呈现视图。

当您(重新)加载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;

最新更新