我希望我的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;