【问题标题】:How to adjust height of UITableView to be the height of the content size?如何将 UITableView 的高度调整为内容大小的高度?
【发布时间】: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
    }
}

【问题讨论】:

    标签: swift uitableview autolayout storyboard


    【解决方案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】:

      我建议如下:

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

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

      代码示例:

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

      【讨论】:

        猜你喜欢
        • 2017-07-15
        • 2012-11-14
        • 2014-11-06
        • 1970-01-01
        • 2011-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多