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

Posted

技术标签:

【中文标题】是否可以继承 UITableView 并根据单元格的数量使其高度具有内在的内容大小?【英文标题】:Is it possible to subclass UITableView and make it have an intrinsic content size for its height based on the number of cells? 【发布时间】:2014-11-25 19:10:04 【问题描述】:

我希望我的UITableView 尽可能高,因为它漂浮在主要的UIViewControllerview 之上。如果我硬编码一个 200 的高度并且表格中只有一个单元格,它看起来很傻。

我知道在我的视图控制器中,我可以监控表格视图并根据它拥有的单元格数量定义它的高度,但高度是视图的属性,对于 MVC,它不会控制器主动管理视图的高度非常有意义。

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

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

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

【问题讨论】:

为什么反对让VC告诉视图最大可用空间?这是完全有效的,ios 一直通过为视图提供边界来完成。 @dogsgod 因为在 MVC 范式下,我更愿意将视图留给它自己。 【参考方案1】:

您可以通过让 table view 使用它的 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: 和 reloadSections:withRowAnimation: 如果你也用其中任何一个来更新你的表。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于是否可以继承 UITableView 并根据单元格的数量使其高度具有内在的内容大小?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 UITableViewCell 中添加 UITableView

是否可以在 UITableview 中搜索静态单元格?

UITableView 重新加载除一个以外的所有单元格

UITableView - 通过点击现有单元格插入新行

根据图像问题的 UITableview 单元格高度

在 iOS 中重新加载特定的 UITableView 单元格