如何动态设置 UITableView 的高度?

Posted

技术标签:

【中文标题】如何动态设置 UITableView 的高度?【英文标题】:How to dynamically set the height of a UITableView? 【发布时间】:2013-09-13 11:01:59 【问题描述】:

我有一个使用heightForRowAtIndexPath: 方法的具有不同单元格高度的表格视图。

我想动态设置UITableView 的高度。目前我正在使用viewDidLoad 方法设置tableView 的尺寸:

self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(10, 770, 310, 400)];
self.tableView.dataSource = self;
self.tableView.delegate = self;

我想也许我可以添加这个:self.tableView.contentSize.height; 但问题当然是内容大小仅在表格加载后计算,所以如果我把它放在

self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(10, 770, 310, self.tableView.contentSize.height)];

它不起作用。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    NSString *description = [photosFromCommentsArray objectAtIndex:indexPath.row];
    //   NSLog(@"description is %@",description);

    if(description == (id)[NSNull null])
    
        return 70; 
    
    else
    
        return 200;
    

【问题讨论】:

更改高度后是否重新加载表格? 【参考方案1】:

为table view的contentSize属性添加观察者,并相应调整frame

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

然后在回调中:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

    CGRect frame = self.tableView.frame;
    frame.size = self.tableView.contentSize;
    self.tableView.frame = frame;

【讨论】:

太棒了!工作完美,谢谢!它现在确实会关闭我的滚动视图,所以我必须调整它,因为 tableview 不在屏幕上。 @Rushabh 它在 addObserver 调用中的 self 类中 值得注意的是,确保在完成所有操作后删除Observer。【参考方案2】:

你可以随时设置tableView的frame。您甚至可以为大小的变化设置动画。

【讨论】:

【参考方案3】:

您好,您可以使用下面的代码获取文本的高度并根据它设置高度。

CGFloat textViewWidth = CGRectGetWidth(textView.bounds);
CGSize inset = CGSizeMake(5.0,5.0);
CGSize stringSize = [myString sizeWithFont:textView.font constrainedToSize:CGSizeMake(textViewWidth-2*inset.width,1024) lineBreakMode:UILineBreakModeWordWrap];
BOOL textOutOfFit = stringSize.height+2*inset.height>CGRectGetHeight(textView.bounds);

【讨论】:

【参考方案4】:

viewDidLoad 中试试这个:

[tableView setFrame:CGRectMake(tableView.frame.origin.x, tableView.frame.origin.y + 4, tableView.frame.size.width, tableView.frame.size.height - 65)];

【讨论】:

【参考方案5】:

第 1 步:在 viewDidLoad() 中添加观察者

self.tableView.addObserver(self, forKeyPath: "contentSize", options: [], context: nil)

第二步:添加方法

 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) 
    self.tableViewHeight.constant = tableView.contentSize.height

第 3 步:移除观察者

override func viewDidDisappear(_ animated: Bool) 
    self.removeObserver(self, forKeyPath: "contentSize", context: nil)


替代解决方案:

    tableView.separatorStyle = .none
    tableView.rowHeight = UITableView.automaticDimension
    tableView.estimatedRowHeight = CGFloat(70.0)

self.tableViewHeight.constant = CGFloat.greatestFiniteMagnitude self.tableView.layoutIfNeeded()

self.tableView.reloadData()

覆盖 func viewWillLayoutSubviews() super.viewWillLayoutSubviews()

    UIView.animate(withDuration: 0, animations: 
        self.tableView.layoutIfNeeded()
    )  (complete) in
        var heightOfTableView: CGFloat = 0.0
        // Get visible cells and sum up their heights
        let cells = self.tableView.visibleCells
        for cell in cells 
            heightOfTableView += cell.frame.height
        
        // Edit heightOfTableViewConstraint's constant to update height of table view
        self.tableViewHeight.constant = heightOfTableView
    

另一种解决方案:

self.tableViewHeight.constant = CGFloat(arrVideoList.count * 80)
self.view.updateConstraintsIfNeeded()

【讨论】:

以上是关于如何动态设置 UITableView 的高度?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:在 Swift 中动态设置 UITableView 高度

如何将 UIImage 设置为 UITableView Cell,它根据我在 UILabel 中输入的文本动态计算单元格高度?

如何将UIImage设置为UITableView Cell,根据我在UILabel中输入的文本动态计算单元格高度?

在 UITableView 上实现动态高度

如何根据ios 8中的内容动态调整UITableview Header高度

当单元格高度为动态时设置 UITableView 的高度