16

所以我有一个非常基本的问题。我UITableView在 a中有这个view,我想让这个表的高度尽可能高,以显示表中的所有行。因此,我不想滚动,我只想显示所有行。(行的数量和 是动态的height)。

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CGSize cellSize = [[[_stepsArray objectAtIndex:indexPath.row]content] sizeWithFont:[UIFont boldSystemFontOfSize:18.0f] constrainedToSize:CGSizeMake(528.0f, CGFLOAT_MAX)lineBreakMode:NSLineBreakByWordWrapping];
    return cellSize.height;
}

如果有 20 行,表格会很高,但如果只有 1 行,就会很小,其他内容不会出现在 19 行下面。

4

6 回答 6

22

如果我理解正确,您应该能够将每行的高度相加并基于此调整 tableview 高度:

CGFloat tableHeight = 0.0f;
for (int i = 0; i < [_stepsArray count]; i ++) {
    tableHeight += [self tableView:self.tableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
}
self.tableView.frame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y, self.tableView.frame.size.width, tableHeight);

您可以在 [tableView reloadData] 之后立即执行此操作

于 2012-11-26T22:24:11.247 回答
6

这是更简单的解决方案:您只需sizeToFitUITableView, 填充单元格后设置它。如果您设置delegatedataSource通过xib,您可以在您的viewDidLoad方法中执行此操作,或者viewDidAppear,像这样:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [yourTableView sizeToFit];
}

但是,如果您在代码中的某处添加delegate和,则必须在此之后添加:dataSourcesizeToFit

- (void)someMethod
{
    [yourTableView setDelegate:self];
    [yourTableView setDataSource:self];

    [yourTableView sizeToFit];
}

此外,如果您在某处这样做,则必须在 reloadTable 之后执行此操作。

这会将您的表格精确调整为高度,这是其单元格高度的总和!

于 2014-06-13T10:01:52.790 回答
4

你可以这样试试

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if([indexPath row] == ((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject]).row){
        NSLog(@"%f",your_tableView.contentSize.height);
    }
}

Swift 3.0中

func tableView(_ tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if indexPath.row == tableView.indexPathsForVisibleRows?.last?.row {
        print("\(tableView.contentSize.height)")
    }
}
于 2013-09-21T12:49:47.903 回答
3

在 table view 上为 contentSize 属性添加一个观察者,并相应地调整框架大小

在 viewDidLoad 添加以下代码行

[your_tableview addObserver:self forKeyPath:@"contentSize" options:0 context:NULL];

然后在回调中:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
         CGRect frame = your_tableview.frame;
         frame.size = your_tableview.contentSize;
         your_tableview.frame = frame;
    }

希望这会帮助你。

于 2014-08-21T05:16:11.317 回答
3

在桌子上设置高度约束,连接到插座,并将以下内容添加到您的视图控制器:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    tableViewHeightContraint.constant = tableView.contentSize.height
}
于 2017-04-06T19:42:23.807 回答
0

只需使用tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; 这将解决您的问题。

于 2015-03-07T06:14:01.007 回答