UIPopoverController中的动态UITableView高度(contentSizeForViewInPopover)?

时间:2011-06-10 22:50:42

标签: objective-c cocoa-touch ipad uitableview uipopovercontroller

我有一个包含UITableView的ipad popover。填充表后,它通常只有一些项目(4-5),所以我正在寻找一种方法来将popover(contentSizeForViewInPopover)的大小调整为实际的表高度(总高度)它的所有细胞)。

所以,我确实有高度,但我不确定在哪里拨打contentSizeForViewInPopover,我确实试着将其称为:viewDidAppearviewWillAppear但是没有成功,因为它似乎表格后来填充,实际高度仅在以后可用。

对此有何想法?谢谢!

编辑:我的单元格根据其携带的内容有不同的高度,我无法使用noOfRows * cellHeight预先计算高度。

7 个答案:

答案 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.

更新答案:

如果单元格大小不同,您可能必须执行以下操作之一:

  1. 强制文本缩小,以便所有单元格具有相同的高度......这可以使用

    完成

    'sizeToFit'

  2. 您必须使用其他功能查找文本的高度。有点像...

    • (float)calculatedHeight { return textLabel.frame.origin.ytextLabel.frame.size.height5; }
  3. 您可以查看THIS 教程,了解UITableViewCell的变量文字大小。

  4. 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)
 }