我有一个包含UITableView
的ipad popover。填充表后,它通常只有一些项目(4-5),所以我正在寻找一种方法来将popover(contentSizeForViewInPopover
)的大小调整为实际的表高度(总高度)它的所有细胞)。
所以,我确实有高度,但我不确定在哪里拨打contentSizeForViewInPopover
,我确实试着将其称为:viewDidAppear
和viewWillAppear
但是没有成功,因为它似乎表格后来填充,实际高度仅在以后可用。
对此有何想法?谢谢!
编辑:我的单元格根据其携带的内容有不同的高度,我无法使用noOfRows * cellHeight
预先计算高度。
答案 0 :(得分:18)
我希望在我的观看次数与contentSizeForViewInPopover
匹配时以及在我调用UITableView
时更改reloadData
,因为我在删除或添加行或部分时只调用它。
以下方法计算正确的高度和宽度,并设置contentSizeForViewInPopover
-(void) reloadViewHeight
{
float currentTotal = 0;
//Need to total each section
for (int i = 0; i < [self.tableView numberOfSections]; i++)
{
CGRect sectionRect = [self.tableView rectForSection:i];
currentTotal += sectionRect.size.height;
}
//Set the contentSizeForViewInPopover
self.contentSizeForViewInPopover = CGSizeMake(self.tableView.frame.size.width, currentTotal);
}
答案 1 :(得分:11)
这个回答是由上述评论之一的@BenLings提供的。这是一个非常干净的解决方案,值得拥有自己的答案:
- (CGSize)contentSizeForViewInPopover {
// Currently no way to obtain the width dynamically before viewWillAppear.
CGFloat width = 200.0;
CGRect rect = [self.tableView rectForSection:[self.tableView numberOfSections] - 1];
CGFloat height = CGRectGetMaxY(rect);
return (CGSize){width, height};
}
答案 2 :(得分:1)
间接方法:
使用
设置UITableViewCell的自定义高度- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [indexPath row] * 40;
}
查找程序某一点的总行数...使用numberOfRowsInSection获取行数。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.yourArray count];
//yourArray is the array with which you are populating the tableView
}
如果您有多个部分,请将其复数,并显示有效行数的行数。
现在
UITableView Actual Height = Height of UITableViewCell * Total number of rows.
更新答案:
如果单元格大小不同,您可能必须执行以下操作之一:
强制文本缩小,以便所有单元格具有相同的高度......这可以使用
完成'sizeToFit'
您必须使用其他功能查找文本的高度。有点像...
您可以查看THIS 教程,了解UITableViewCell的变量文字大小。
https://discussions.apple.com/thread/1525150?start=0&tstart=0
答案 3 :(得分:1)
我是从包含表格的控制器那样做的:
- (void)updatePopoverContentSize {
CGSize size = { CGFLOAT_MAX, CGFLOAT_MAX };
size = [self.tableView sizeThatFits: size];
size.width = 320; // some hard-coded value table doesn't return anything useful for width
size.hight = MIN(size.hight, 400); // make sure it is not too big.
self.contentSizeForViewInPopover = size;
}
答案 4 :(得分:1)
没有必要创建一个人工钩子,这个效果很好(至少在iOS 7上):
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
CGSize size = self.view.bounds.size;
size.height = fmaxf(size.height, self.tableView.contentSize.height);
self.preferredContentSize = size;
}
答案 5 :(得分:0)
获得高度的另一种方法是将UITableViewController
的视图添加alpha
设置为0.0
到视图层次结构,然后使用{{获取内容大小1}}表视图的属性。这是可能的,因为表视图是滚动视图的子类。
获得内容大小后,请设置contentSize
的值,然后将其推送到弹出窗口。
答案 6 :(得分:0)
这应该可以解决问题
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height)
}