如何将 UITableView 的高度调整为内容大小的高度?

Posted

技术标签:

【中文标题】如何将 UITableView 的高度调整为内容大小的高度?【英文标题】:How to adjust height of UITableView to be the height of the content size? 【发布时间】:2022-01-22 22:22:04 【问题描述】:

我想让表格视图的高度动态化,我想在表格视图的下方和上方添加一些其他视图。我正在尝试在滚动视图中添加表格视图以使其滚动。

但是,我找不到正确的输出。

表格视图行可能不同 表格上方和下方可能存在视图 表格视图不应滚动 只有滚动视图才能滚动

这是我的代码:

class ViewController: UIViewController 
    
    var content = [Int]()
    
    var scroll: UIScrollView = 
        let view = UIScrollView()
        return view
    ()

    var table: DynamicSizeTableView = 
        let view = DynamicSizeTableView()
        view.estimatedRowHeight = 64
        view.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        return view
    ()
    
    var image: UIImageView = 
        let img = UIImageView(image: UIImage(systemName: "square.and.arrow.up"))
        img.widthAnchor(equalTo: 64)
        img.heightAnchor(equalTo: 64)
        return img
    ()
    
    override func viewDidLoad() 
        
        super.viewDidLoad()
        setupViews()
        
        table.delegate = self
        table.dataSource = self
        
        for i in 0...60 
            self.content.append(i)
        
    
    
    override func viewDidAppear(_ animated: Bool) 
        super.viewDidAppear(animated)
        self.view.layoutIfNeeded()
    
    
    func setupViews() 
        self.view.addSubview(scroll)
        scroll.fill(to: view)
        scroll.addSubview(table)
        scroll.addSubview(image)

        table.topAnchor(equalTo: self.scroll.topAnchor)
        table.leadingAnchor(equalTo: self.scroll.leadingAnchor)
        table.trailingAnchor(equalTo: self.scroll.trailingAnchor)
     
        image.topAnchor(equalTo: self.table.bottomAnchor)
        image.bottomAnchor(equalTo: self.scroll.bottomAnchor)
    



extension ViewController: UITableViewDelegate, UITableViewDataSource 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return content.count
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
        cell.backgroundColor = .red
        cell.textLabel?.text = "Row \(content[indexPath.row])"
        return cell
    
    


public class DynamicSizeTableView: UITableView 
    override public func layoutSubviews() 
        super.layoutSubviews()
        if bounds.size != intrinsicContentSize 
            invalidateIntrinsicContentSize()
        
    

    override public var intrinsicContentSize: CGSize 
        return contentSize
    

【问题讨论】:

【参考方案1】:

你应该试试stackview。将stackview约束到scrollview,stackview将处理内部元素的高度。如果你愿意,你可以给里面的最小高度。

  lazy var littleVstack:UIStackView = 
    let view = UIStackView(arrangedSubviews: [table,image])
    view.translatesAutoresizingMaskIntoConstraints = false
    view.axis = .vertical
    view.arrangedSubviews[0].heightAnchor.constraint(equalToConstant: 200).isActive = true
    return view
()

加上表格视图无响应。

tableView.isUserInteractionEnabled = false

【讨论】:

【参考方案2】:

我建议如下:

    为表格视图添加高度限制。 将其常量设置为使其在情节提要上合理可见的任何值。 将高度限制连接到插座。 每次在表格视图上重新加载数据时,都会更改高度常量。

您可能还想通过将表格视图的 Inset 添加到内容大小来考虑它。

代码示例:

CGFloat height = myTableView.collectionViewLayout. contentSize.height
heightConstraint.constant = height
self.view.setNeedsLayout() Or self.view.layoutIfNeeded()

【讨论】:

以上是关于如何将 UITableView 的高度调整为内容大小的高度?的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 标题部分的高度不会为自定义 UIView() 类自动调整

使用 Auto Layout 将 UITableView 的高度设置为其内容的高度

动态调整 UITableView 高度

如何使节标题中的 UITextView 将其高度调整为其内容

如何实现自定尺寸 UITableView?

将 UITableView 大小调整为 iPhone 5/5s