Ios 是否可以将UITableView子类化,并根据单元格的数量为其高度设置一个固有的内容大小?

Ios 是否可以将UITableView子类化,并根据单元格的数量为其高度设置一个固有的内容大小?,ios,objective-c,cocoa-touch,uitableview,uiview,Ios,Objective C,Cocoa Touch,Uitableview,Uiview,我希望我的UITableView只与需要的高度一样高,因为它漂浮在主UIViewController的视图上。如果我硬编码高度为200,而表中只有一个单元格,那看起来很傻 我知道,在我的视图控制器中,我可以监视表视图,并根据其拥有的单元格数定义其高度,但高度是视图的一个属性,对于MVC来说,控制器主动管理视图的高度没有多大意义 是否可以有一个UITableView子类,并让它根据所包含的单元格数量定义一个内在高度?因此,使用Auto Layout,我可以将子类添加到视图中,指定其宽度,垂直居中,

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

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

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

这就像一个
UILabel
能够在水平和垂直方向上居中,与左右方向保持一定距离,并使其在垂直方向上自动增长和收缩

我是否可以使用
UITableView
子类执行此操作?

当您(重新)加载
表视图中的数据时,可以执行此操作。
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;

您可以通过让表视图使用其contentSize属性“知道”它需要多高来轻松做到这一点。如果使用的是估计的行高,则该值可能有点不准确,但应该足够好了。在本例中,我为表视图提供了高度约束(以及宽度和中心),并为其创建了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);
}
您还必须覆盖重新加载的rowsatindexpaths:withRowAnimation:and
reloadSections:withRowAnimation:如果您正在用其中一个更新表。

这感觉像是您在设计UI时遇到的鸡/蛋问题。听起来您想根据浮动tableview包含的行数*每行的高度来设置浮动tableview的高度,但是tableview在绘制之前不知道这些信息,即[tableview reloadData]和相应的row delegate方法的高度被调用


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

为什么你反对让VC告诉视图最大可用空间?这是非常有效的,iOS通过为视图提供边界一直在这么做。@dogsgod,因为在MVC范式下,我更喜欢将视图留给自己。